STC8串口数据多了后漏发数据
本帖最后由 梦在那 于 2024-9-9 17:11 编辑在主程序里实现把接收到的数据再用串口发出去,每次数据格式基本固定,
内容多了后就会出现少发数据的情况,这是啥情况。晶振:22.1184MHz,波特率19200、38400、57600都试了,都会出现少发数据的情况图片是接收的是已经发出来的数据
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); //收到的数据原样返回
}
COM1.RX_Cnt = 0;
}
}
}
}
问题可能就在你没发出来的代码里,比如RX_cnt是不是8位的,看你的长度可能有200了,有没有防止溢出的处理?
buffer长度够不够?
发送数据有没有关闭接收中断? 本帖最后由 梦在那 于 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-9 17:30
问题可能就在你没发出来的代码里,比如RX_cnt是不是8位的,看你的长度可能有200了,有没有防止溢出的处理?
buf ...
长度是184字节,RX_cnt是u8的,RX1_Buffer也是u8,u8定义的是unsigned char
typedef struct
{
u8 id; //串口号
u8 TX_read; //发送读指针
u8 TX_write; //发送写指针
u8 B_TX_busy; //忙标志
u8 RX_Cnt; //接收字节计数
u8 RX_TimeOut; //接收超时
u8 B_RX_OK; //接收块完成
} COMx_Define; 不要怀疑芯片,如果这么低级的错误,芯片公司都会犯,他早倒闭了。 你这个还只是串口,相对来说还要简单一些,前几天在调试STC32G12K64,调485收发,串口DMA发送,普通接收,也是遇到问题,调了一天多,才调好,最后发现还是自己的问题,之前做了很多的项目都是用的STC单片机,开始都以为是芯片的问题,最后发现全部是自己的问题,这些基础功能,他们是不会那么容易出现BUG的,出BUG的都是一些特殊场合的应用,数据手册中会有说明,如何避坑。 梦在那 发表于 2024-9-9 17:46
长度是184字节,RX_cnt是u8的,RX1_Buffer也是u8,u8定义的是unsigned char
buffer空间有多大?接收数据往里写有没有防溢出?
两组数据一起来它能正确处理不? 给你一个参考,串口接收数据的时候,一定要等一帧数据接收完了再去读取,不然会出错。
最近正在调试的板子,4路485,1路CAN,4路485有3种波特率,四路串口全部都需要同时工作,一样工作的很稳定,用的STC32G12K64.
串口有线通信,基本也没有干扰,你还是主动发送,怎么可能会漏?仔细检查程序吧。 是不是中断打断了 转发的时候要禁止接收,转发完才能继续接收。
还有你最好接收一帧完成置个标志,循环查询标志后转发。
像你上面写的就是延时一段时间,查到有收到数据就转发,都没有确定是不是一整帧数据,可能没接收到整帧数据就转发了 linxi6414 发表于 2024-9-9 17:58
你这个还只是串口,相对来说还要简单一些,前几天在调试STC32G12K64,调485收发,串口DMA发送,普通接收, ...
是的,肯定还是自己程序有问题,没怀疑过芯片的问题{:shutup:} WoodData 发表于 2024-9-10 09:22
转发的时候要禁止接收,转发完才能继续接收。
还有你最好接收一帧完成置个标志,循环查询标志后转发。
像你 ...
在串口程序中有中断完成标志位的
void UART1_int (void) interrupt UART1_VECTOR
{
if(RI)
{
RI = 0;
if(COM1.B_RX_OK == 0)
{
if(COM1.RX_Cnt >= COM_RX1_Lenth) COM1.RX_Cnt = 0;
RX1_Buffer = SBUF;
COM1.RX_TimeOut = TimeOutSet1;
}
}
if(TI)
{
TI = 0;
if(COM1.TX_read != COM1.TX_write)
{
SBUF = TX1_Buffer;
if(++COM1.TX_read >= COM_TX1_Lenth) COM1.TX_read = 0;
}
else COM1.B_TX_busy = 0;
}
} linxi6414 发表于 2024-9-9 19:00
最近正在调试的板子,4路485,1路CAN,4路485有3种波特率,四路串口全部都需要同时工作,一样工作的很稳定 ...
板子画的很规整,学习了 梦在那 发表于 2024-9-10 12:03
板子画的很规整,学习了
一直感觉自己画的板不好,跟个垃圾似的,这个只是一个首版的测试板,根据测试需求,后面再修改。 发完一个才能再发。时间间隔要能够,与波特率有关。 最好用环形缓冲区接收发送 感觉是不是发的频率太快,如果你的数据量大你的波特率要高一些,而且要发完一个再发下一个,不能被中断。
页:
[1]