OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4015|回复: 2

stm8的串口收发多个字节时出错

[复制链接]

0

主题

0

帖子

0

精华

新手入门

积分
1
金钱
1
注册时间
2020-4-29
在线时间
0 小时
发表于 2017-4-24 10:36:34 | 显示全部楼层 |阅读模式
1金钱
我这样修改程序,在中断里写接收到了2个字节的数据 就把标志位flagTxd置1,主函数里判断flagTxd是否置1,然后把数据给发出来,这样是收发没问题的,但是 if(UART_RX_NUM==2)这个计数的条件 我换成大于等1他就是一个字节正常收发,大于等于2他就是两个字节正常收发,多了少了都发的接受错误的数据,感觉 RX_MUN没有在2个函数同步操作,我想不通原因,纠结了好久,求教各位老师了。
INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
{
    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */
      if(UART1_GetITStatus(UART1_IT_RXNE)!= RESET)                     
          RxBuffer[ UART_RX_NUM++] = UART1_ReceiveData8();
         if(UART_RX_NUM==2)
         {
          flagTxd=1;
         }
       UART1_ClearITPendingBit(UART1_IT_RXNE);


int main( void )
{
     u8 i,len1;
  sysInit();
   while(1)
  {
     
if(flagTxd==1)
       {
         flagTxd=0;
        len1=UART_RX_NUM;        //得到此次接收到的数据长度
        UART_RX_NUM=0;
       //UART1_Send_Byte(len1);   
      for(i=0;i<len1;i++)
        {
           UART1_Send_Byte(RxBuffer);
          }
         delay_us(50);


void UART1_Send_Byte(u8 byte)
{
    UART1_SendData8(byte);//UART1发送8位数据
   while(UART1_GetFlagStatus(UART1_FLAG_TXE)==RESET);//等待发送完成
}






正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2017-3-24
在线时间
7 小时
发表于 2017-5-10 07:43:57 | 显示全部楼层
串口通讯 没个字节接收是有一定间隔时间的,你可以配合定时器来判断,如果没有超时认为数据还没有接收完成,知道超时了数据接收才完成,这是一种方法,还有就是你接受数据的时候判断数据结束字符,也可以
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-5-3
在线时间
7 小时
发表于 2017-5-10 14:46:45 | 显示全部楼层
这样有一个明显的弊端,如果数据量大,或者任务较多,主程序不清楚标志,就出错
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-9-27 06:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表