[STC单片机] STC8串口数据多了后漏发数据

[复制链接]
3007|26
 楼主| 梦在那 发表于 2024-9-9 17:08 | 显示全部楼层 |阅读模式
本帖最后由 梦在那 于 2024-9-9 17:11 编辑

在主程序里实现把接收到的数据再用串口发出去,每次数据格式基本固定,
内容多了后就会出现少发数据的情况,这是啥情况。晶振:22.1184MHz,波特率19200、38400、57600都试了,都会出现少发数据的情况图片是接收的是已经发出来的数据
  1.         while (1)
  2.         {
  3.                 delay_ms(5);
  4.                
  5.                 if(COM1.RX_TimeOut > 0)                //超时计数
  6.                 {
  7.                         if(--COM1.RX_TimeOut == 0)
  8.                         {
  9.                                 P54=!P54;
  10.                                 PrintString1("No01:\r\n");
  11.                                 if(COM1.RX_Cnt > 0)
  12.                                 {
  13.                                        
  14.                                         for(i=0; i<COM1.RX_Cnt; i++)        
  15.                                         TX1_write2buff(RX1_Buffer[i]);        //收到的数据原样返回
  16.                                 }
  17.                                                                         
  18.                                 COM1.RX_Cnt = 0;
  19.                         }
  20.                 }
  21.         }
  22. }


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评论

最后这个 No01: 8 这里就少发了一次数据 8  发表于 2024-9-9 17:12
LcwSwust 发表于 2024-9-9 17:30 | 显示全部楼层
问题可能就在你没发出来的代码里,比如RX_cnt是不是8位的,看你的长度可能有200了,有没有防止溢出的处理?
buffer长度够不够?
发送数据有没有关闭接收中断?
 楼主| 梦在那 发表于 2024-9-9 17:37 | 显示全部楼层
本帖最后由 梦在那 于 2024-9-9 17:43 编辑

在每字节数据发送后都加了个10us延时,目前测试了10分钟,少发情况大大减少。还得改,后续再观察观察
while (1)
        {
                delay_ms(5);
               
                if(COM1.RX_TimeOut > 0)                //超时计数
                {
                        if(--COM1.RX_TimeOut == 0)
                        {
                                P54=!P54;
                                PrintString1("No01:\r\n");
                                if(COM1.RX_Cnt > 0)
                                {
                                       
                                        for(i=0; i<COM1.RX_Cnt; i++)        
                                        TX1_write2buff(RX1_Buffer);        //收到的数据原样返回
                                        Delay10us();
                                }
                                                                        
                                COM1.RX_Cnt = 0;
                        }
                }
        }

评论

@LcwSwust :现在测了快一个小时了,目前没问题。非常感谢  发表于 2024-9-10 12:01
@梦在那 :ok  发表于 2024-9-10 11:14
@LcwSwust :我又查看了下,我的buffer长度定义的就是188,我改成了255,现在用串口直连测试没有问题。我是单片机把接收的数据通过无线模块再发出去,电脑接收。我再用模块试试。感谢提醒  发表于 2024-9-10 11:12
@LcwSwust :有效是有效,但还是有少发情况  发表于 2024-9-10 09:21
看起来延时在for循环之外啊,确定有效?  发表于 2024-9-9 18:26
 楼主| 梦在那 发表于 2024-9-9 17:46 | 显示全部楼层
LcwSwust 发表于 2024-9-9 17:30
问题可能就在你没发出来的代码里,比如RX_cnt是不是8位的,看你的长度可能有200了,有没有防止溢出的处理?
buf ...

长度是184字节,RX_cnt是u8的,RX1_Buffer也是u8,u8定义的是unsigned char
  1. typedef struct
  2. {
  3.         u8        id;                                //串口号

  4.         u8        TX_read;                //发送读指针
  5.         u8        TX_write;                //发送写指针
  6.         u8        B_TX_busy;                //忙标志

  7.         u8         RX_Cnt;                        //接收字节计数
  8.         u8        RX_TimeOut;                //接收超时
  9.         u8        B_RX_OK;                //接收块完成
  10. } COMx_Define;
linxi6414 发表于 2024-9-9 17:54 | 显示全部楼层
不要怀疑芯片,如果这么低级的错误,芯片公司都会犯,他早倒闭了。
linxi6414 发表于 2024-9-9 17:58 | 显示全部楼层
你这个还只是串口,相对来说还要简单一些,前几天在调试STC32G12K64,调485收发,串口DMA发送,普通接收,也是遇到问题,调了一天多,才调好,最后发现还是自己的问题,之前做了很多的项目都是用的STC单片机,开始都以为是芯片的问题,最后发现全部是自己的问题,这些基础功能,他们是不会那么容易出现BUG的,出BUG的都是一些特殊场合的应用,数据手册中会有说明,如何避坑。
LcwSwust 发表于 2024-9-9 18:28 | 显示全部楼层
梦在那 发表于 2024-9-9 17:46
长度是184字节,RX_cnt是u8的,RX1_Buffer也是u8,u8定义的是unsigned char

buffer空间有多大?接收数据往里写有没有防溢出?
两组数据一起来它能正确处理不?
linxi6414 发表于 2024-9-9 18:40 | 显示全部楼层
给你一个参考,串口接收数据的时候,一定要等一帧数据接收完了再去读取,不然会出错。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
linxi6414 发表于 2024-9-9 19:00 | 显示全部楼层
最近正在调试的板子,4路485,1路CAN,4路485有3种波特率,四路串口全部都需要同时工作,一样工作的很稳定,用的STC32G12K64.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
coody 发表于 2024-9-9 22:03 | 显示全部楼层
串口有线通信,基本也没有干扰,你还是主动发送,怎么可能会漏?仔细检查程序吧。
xionghaoyun 发表于 2024-9-10 08:17 | 显示全部楼层
是不是中断打断了
WoodData 发表于 2024-9-10 09:22 | 显示全部楼层
转发的时候要禁止接收,转发完才能继续接收。
还有你最好接收一帧完成置个标志,循环查询标志后转发。
像你上面写的就是延时一段时间,查到有收到数据就转发,都没有确定是不是一整帧数据,可能没接收到整帧数据就转发了
 楼主| 梦在那 发表于 2024-9-10 09:22 | 显示全部楼层
linxi6414 发表于 2024-9-9 17:58
你这个还只是串口,相对来说还要简单一些,前几天在调试STC32G12K64,调485收发,串口DMA发送,普通接收, ...

是的,肯定还是自己程序有问题,没怀疑过芯片的问题
 楼主| 梦在那 发表于 2024-9-10 11:14 | 显示全部楼层
WoodData 发表于 2024-9-10 09:22
转发的时候要禁止接收,转发完才能继续接收。
还有你最好接收一帧完成置个标志,循环查询标志后转发。
像你 ...

在串口程序中有中断完成标志位的
  1. void UART1_int (void) interrupt UART1_VECTOR
  2. {
  3.         if(RI)
  4.         {
  5.                 RI = 0;
  6.                 if(COM1.B_RX_OK == 0)
  7.                 {
  8.                         if(COM1.RX_Cnt >= COM_RX1_Lenth)        COM1.RX_Cnt = 0;
  9.                         RX1_Buffer[COM1.RX_Cnt++] = SBUF;
  10.                         COM1.RX_TimeOut = TimeOutSet1;
  11.                 }
  12.         }

  13.         if(TI)
  14.         {
  15.                 TI = 0;
  16.                 if(COM1.TX_read != COM1.TX_write)
  17.                 {
  18.                          SBUF = TX1_Buffer[COM1.TX_read];
  19.                         if(++COM1.TX_read >= COM_TX1_Lenth)                COM1.TX_read = 0;
  20.                 }
  21.                 else        COM1.B_TX_busy = 0;
  22.         }
  23. }

评论

@LcwSwust :好的,我试试看  发表于 2024-9-12 16:16
原来问题在这:if(COM1.RX_Cnt >= COM_RX1_Lenth) COM1.RX_Cnt = 0; 好不容易收到的数据干嘛要清零,建议用这种方式: d=sbuf; if(n<len)buf[n++]=d;  发表于 2024-9-10 13:37
 楼主| 梦在那 发表于 2024-9-10 12:03 | 显示全部楼层
linxi6414 发表于 2024-9-9 19:00
最近正在调试的板子,4路485,1路CAN,4路485有3种波特率,四路串口全部都需要同时工作,一样工作的很稳定 ...

板子画的很规整,学习了
linxi6414 发表于 2024-9-10 12:36 | 显示全部楼层
梦在那 发表于 2024-9-10 12:03
板子画的很规整,学习了

一直感觉自己画的板不好,跟个垃圾似的,这个只是一个首版的测试板,根据测试需求,后面再修改。
dami 发表于 2024-9-11 08:46 | 显示全部楼层
发完一个才能再发。时间间隔要能够,与波特率有关。
kissdb 发表于 2024-9-11 21:16 | 显示全部楼层
最好用环形缓冲区接收发送
cooldog123pp 发表于 2024-9-12 10:57 | 显示全部楼层
感觉是不是发的频率太快,如果你的数据量大你的波特率要高一些,而且要发完一个再发下一个,不能被中断。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

234

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部