完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
C# 串口中断中接收缓冲区会在下次进入时突然变成几百个数据(断点调试看到的),按理说请求一次数据只会接收到19个字节的,请求数据放在一个100ms的定时器里进行
上位机程序: public void port_DataRecived(object sender, SerialDataReceivedEventArgs e) { byte[] r = new byte[serialPort1.BytesToRead]; if (r.Length != 0){ serialPort1.Read(r, 0, r.Length); PortReceivedList.AddRange(r); } while (true){ if (PortReceivedList.Count>19){ if (PortReceivedList[0] == 0x66 && PortReceivedList[1] == 0x66 && PortReceivedList[2] == 0x66){ int CalculateCRC = 0; int CRC = ((int)PortReceivedList[17] << 8) | PortReceivedList[18]; for (int i = 3; i<17; i++) { CalculateCRC += PortReceivedList[i]; } if (CRC == CalculateCRC){ int ID = PortReceivedList[3]; O_DY[ID] = (ushort)(((ushort)(PortReceivedList[5] & 0x0f) << 8) | PortReceivedList[6]); O_DL[ID] = (ushort)(((ushort)(PortReceivedList[7] & 0x0f) << 8) | PortReceivedList[8]); DCDY[ID] = (ushort)(((ushort)(PortReceivedList[9] & 0x0f) << 8) | PortReceivedList[10]); DCDL[ID] = (ushort)(((ushort)(PortReceivedList[11] & 0x0f) << 8) | PortReceivedList[12]); SDDY[ID] = (ushort)(((ushort)(PortReceivedList[13] & 0x0f) << 8) | PortReceivedList[14]); SDDL[ID] = (ushort)(((ushort)(PortReceivedList[15] & 0x0f) << 8) | PortReceivedList[16]); SD[ID] = ((PortReceivedList[4] & 0x01) == 0) ? false : true; YJ[ID] = ((PortReceivedList[4] & 0x02) == 0) ? false : true; GZ[ID] = ((PortReceivedList[4] & 0x04) == 0) ? false : true; myPan(); PortReceivedList.RemoveRange(0, 19); InteractiveSuccessful[nowMachine] = true; }else{ //SendCmd(LastCmd[nowMachine], nowMachine); InteractiveSuccessful[nowMachine] = false; } }else{ PortReceivedList.RemoveRange(0,1); } }else{ break; } } } 下位机程序: void USART1_IRQHandler(void) { if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET){ USART_ReceiveData(USART1); } if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){ static u8 DataCount = 0; r[DataCount] = USART_ReceiveData(USART1); if(r[0] != 0x99){ DataCount = 0; }else{ if( DataCount==1 && r[1]!=0x99 ){ DataCount = 0; } } if(++DataCount>=5){ DataCount = 0; if(r[0]==0x99 && r[1]==0x99){ u8 CalculateCRC = (r[2]+r[3])/2.0+0.5; u8 Cmd = r[3]; if(CalculateCRC == r[4]){ if(r[2]==ID){ u16 Crc = 0,i; if(Cmd&0x02){ ForceStop = 1; }else{ ForceStop = 0; } if(Cmd&0x04){ ForceStart = 1; }else{ ForceStart = 0; } txBuffer[4]++; txBuffer[5] = O_DY>>8; txBuffer[6] = O_DY&0xff; txBuffer[7] = O_DL>>8; txBuffer[8] = O_DL&0xff; txBuffer[9] = DCDY>>8; txBuffer[10] = DCDY&0xff; txBuffer[11] = DCDL>>8; txBuffer[12] = DCDL&0xff; txBuffer[13] = SDDY>>8; txBuffer[14] = SDDY&0xff; txBuffer[15] = SDDL>>8; txBuffer[16] = SDDL&0xff; for(i=3;i<17;i++){ Crc += txBuffer[i]; } txBuffer[17] = Crc>>8; txBuffer[18] = Crc&0xff; SendDatas(); } } } } } USART_ClearITPendingBit(USART1, USART_IT_RXNE); } 上位机发送格式:0x99 0x99 ID Cmd CRC(=(byte)(ID+Cmd)/2.0+0.5) 下位机发送格式:0x66 0x66 0x66 ID State(状态标志) Datas(数据12个) CRCh CRCl |
|
相关推荐
3个回答
|
|
SendDatas();
不知道你这个函数里是怎么实现的,使用查询标志位,是不是判读有问题。如果使用中断发送,但是在你的void USART1_IRQHandler(void)里 我没有看到关于发送的标志位判断。
最佳答案
|
|
|
|
愚塘霸主 发表于 2017-10-14 11:31 谢谢你的热心解答,之前很久没人回答就没上这个论坛,今天上来才发现。这个问题解决了。是起始位没有判断正确的原因,因为这是多级通讯,一个单片机发送的数据,不光上位机可以接收到另一个单片机也能接收到,起始位没有判断对所以导致单片机一直在发送数据,另一个单片机误判后也一直发送数据,就存在了许多冲突了! 不过真的谢谢了! |
|
|
|
愚塘霸主 发表于 2017-10-14 11:31 void USART1_IRQHandler(void) { if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET){ USART_ReceiveData(USART1); } if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){ static u8 DataCount = 0; r[DataCount] = USART_ReceiveData(USART1); if(r[0] != 0x99){ DataCount = 0; goto a; }else{ if( DataCount==1 && r[1]!=0x99 ){ DataCount = 0; goto a; } } if(++DataCount>=5){ DataCount = 0; if(r[0]==0x99 && r[1]==0x99){ u8 CalculateCRC = (r[2]+r[3])/2.0+0.5; u8 Cmd = r[3]; if(CalculateCRC == r[4]){ if(r[2]==ID){ u16 Crc = 0,i; if(Cmd&0x02){ ForceStop = 1; }else{ ForceStop = 0; } if(Cmd&0x04){ ForceStart = 1; }else{ ForceStart = 0; } O_DY++,O_DL++, DCDY++,DCDL ++, SDDY++,SDDL++; txBuffer[4]++; txBuffer[5] = O_DY>>8; txBuffer[6] = O_DY&0xff; txBuffer[7] = O_DL>>8; txBuffer[8] = O_DL&0xff; txBuffer[9] = DCDY>>8; txBuffer[10] = DCDY&0xff; txBuffer[11] = DCDL>>8; txBuffer[12] = DCDL&0xff; txBuffer[13] = SDDY>>8; txBuffer[14] = SDDY&0xff; txBuffer[15] = SDDL>>8; txBuffer[16] = SDDL&0xff; for(i=3;i<17;i++){ Crc += txBuffer; } txBuffer[17] = Crc>>8; txBuffer[18] = Crc&0xff; SendDatas(); } } } } a: txBuffer[0] = 0x66; } USART_ClearITPendingBit(USART1, USART_IT_RXNE); } 这是我重新写的,这起始位置判断对了就没问题了 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
205 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1253 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
848 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
853 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1073 浏览 2 评论
OpenHarmony标准系统: 树莓派移植①
12/19/2024, 11:00:00 AM 回顾OpenHarmony稳定性专项分享
12/12/2024, 11:00:00 AM 回顾干簧技术应用:汽车行业新视角
12/11/2024, 6:00:00 AM 回顾OpenHarmony Linux 6.6 内核升级移植分享
12/10/2024, 11:00:00 AM 回顾OpenHarmony性能优化分享
12/5/2024, 11:00:00 AM 回顾OpenHarmony轻量板级移植:STM32移植分享
11/28/2024, 11:00:00 AM 回顾0penHarmony板级移植:龙芯移植适配:DAYU400移植经验分享
11/21/2024, 11:00:00 AM 回顾开发者手机OH5.0切换实践分享
11/19/2024, 11:00:00 AM 回顾OpenHarmony板级移植:RK3568移植分享
11/14/2024, 11:00:00 AM 回顾数据智能系列讲座第4期:预训练的基础模型下的持续学习
10/30/2024, 12:00:00 PM 回顾2024开放原子开源生态大会——开鸿助力产业生态与人才培养分论坛
9/26/2024, 5:30:00 AM 回顾2024开放原子开源生态大会——OpenHarmony生态主题演讲
9/26/2024, 2:00:00 AM 回顾数据智能系列讲座第3期—交流式学习:神经网络的精细与或逻辑与人类认知的对齐
9/25/2024, 12:00:00 PM 回顾2024开放原子开源生态大会——开幕式
9/25/2024, 1:30:00 AM 回顾2024 RISC-V 中国峰会 Day 3 主会场A
8/23/2024, 1:00:00 AM 回顾2024 RISC-V 中国峰会 Day 3 主会场B
8/23/2024, 1:00:00 AM 回顾2024 RISC-V 中国峰会 Day 2 主会场A
8/22/2024, 1:00:00 AM 回顾2024 RISC-V 中国峰会 Day 2 主会场B
8/22/2024, 1:00:00 AM 回顾赛昉科技全场景RISC-V解决方案交流会
8/22/2024, 1:30:00 AM 回顾2024 RISC-V 中国峰会 Day 1 主会场
8/21/2024, 1:00:00 AM 回顾【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12013 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 08:01 , Processed in 0.723372 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号
|