3878|4

107

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

STM32F103的串口接收显示 [复制链接]

3芯积分
我想实现的目的是通过PC上的串口助手给MCU发一个字符,在程序里面可以把这个字符读出来,并且把这个字符付给一个变量,再把这个变量的值付给一个IO口,现在IO口看他的输出波形,不知道这么说你们明不明白,因为刚接触STM32好多地方不懂所以表达的可能也不准确不清楚,找了一个历程,可以实现通过PC给MCU发送字符,MCU在把接收到的字符通过PC上的串口助手显示出来,我就在该程序中串口的接收部分改了一点,程序中的“jieshou”被我定义到了一个IO口,但是串口助手在持续发送,IO口一直是低电平,我也感觉我改的串口接收的这一部分有问题,但是又不知道怎么改才是对的,所以希望大家能给我讲讲该怎么改,其他地方都没改过,之前的程序我也试过了是好的,可以实现PCF发字符给MCU,MCU再将字符返给PC,下面这个是我给的串口中断程序的部分

QQ图片20170224170230.png (10.8 KB, 下载次数: 1)

QQ图片20170224170230.png
此帖出自stm32/stm8论坛

最新回复

arduino形式的行不? //STM32F103C8T6 void setup() { Serial.begin(115200); pinMode(PC13,OUTPUT); } void loop() {   digitalWrite(PC13,HIGH);   if (Serial.available()==1);{     byte date = Serial.read();       if (date != 255){         Serial.print(char(date));         for(int i = 0;i < 8;i++){           digitalWrite(PC13,(date & 0x80));           date = date   详情 回复 发表于 2017-3-5 22:43
点赞 关注(1)
 

回复
举报

107

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
void USART1_IRQHandler(void)
{  int RX_status;  //自己定义一个标志位
RX_status = USART_GetFlagStatus(USART1, USART_FLAG_RXNE);//读取接收数据标志位,如果装好了一帧数据则硬件将其置一。
if(RX_status == SET) {
USART_SendData(USART1 , USART_ReceiveData(USART1));//将收到的数据再由STM32发送给PC机。
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);//等待发送完成。

}
}

这个是这部分程序原来的样子
此帖出自stm32/stm8论坛
 
 

回复

46

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET)这个语句后面加上  ;  试试。
你这样写的情况是在等待发送完成的时候才会进入for循环赋值语句,如果while语句在判断发送标志位的之前已经发送结束了,就不会进入for循环,IO口自然不会有变化
此帖出自stm32/stm8论坛
 
 

回复

602

帖子

1

TA的资源

一粒金砂(中级)

4
 
中断里面可以不用单独定义一个标志,就用官方例程的 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) 挺好的;
最好定义变量放在函数开头;
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET)這句后面少了“;”,這句代码可以不要;
看代码你是想把接收到的一个字节按位赋值给一个IO口,但你程序for执行后,IO口的状态就是接收到字节的最低位,你看看你发送的数据最低位是0还是1,如果是0 那么程序现象是正常的, 因为前面的7次电平变化很快 根本看不到;
最后那合成一句多好 jieshou = ((Res << a) & 0x80) >> 7;
此帖出自stm32/stm8论坛
 
个人签名疏雨客晚归,荒烟乱,几许江南无晴!又落花,残香织梦,莫  莫  莫,白首衷肠……
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
arduino形式的行不?
//STM32F103C8T6
void setup() {
Serial.begin(115200);
pinMode(PC13,OUTPUT);
}
void loop() {
  digitalWrite(PC13,HIGH);
  if (Serial.available()==1);{
    byte date = Serial.read();
      if (date != 255){
        Serial.print(char(date));
        for(int i = 0;i < 8;i++){
          digitalWrite(PC13,(date & 0x80));
          date = date << 1;
          delay(100);
        }
      }
   }
}
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表