协议让我头痛

yangjinCK 2010-06-08 09:00:42
我是一个新手
刚开始学单片机
我想让上位机跟下位机协议通信
上位机我用的C#,这个知道怎么写
但下位机不知道怎么判断数据帧了
协议基本格式是这样的
上位机发送 EB 90 EB 90 04 90 EB
起始码 接收字符个数 结束码
下位机 EB 90 EB 90 04 55 AA 55 AA90 EB
起始码 接收字符个数 4哥字节数据 结束码
我用的51单片机
用C语言实现
来哥大侠帮谢谢代码啊
小弟感激不尽
...全文
102 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
用户 昵称 2010-06-08
  • 打赏
  • 举报
回复
大脑是怎么理解的,程序就应该怎么写。
lbing7 2010-06-08
  • 打赏
  • 举报
回复
上位机发送 EB 90 EB 90 04 90 EB
起始码 接收字符个数 结束码

这个没清楚。

另外,EB 90是只有两组还是任意组?
结束码是反过来的,有点杯具,另外,串口数字是字节传送,能不能用单字节的起始码?这样好处理些
yangjinCK 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 daifeijin 的回复:]
放在一个数据区,一个字节一个字节发就是啦!
[/Quote]
大哥些我就是对C51代码还不熟
要不我郁闷啥呢
就帮写写吧
在线等
daifeijin 2010-06-08
  • 打赏
  • 举报
回复
放在一个数据区,一个字节一个字节发就是啦!
yangjinCK 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 leo_dengzx 的回复:]
这也太。。。。那啥了吧。

这个数据帧的判断你一个字节一个字节的对比就是了,注意一下字节顺序,真是没任何技术含量。

最多加个重发机制。
[/Quote]
我就不晓得咋写
你要是写出来能出结果分全给你
leo_dengzx 2010-06-08
  • 打赏
  • 举报
回复
这也太。。。。那啥了吧。

这个数据帧的判断你一个字节一个字节的对比就是了,注意一下字节顺序,真是没任何技术含量。

最多加个重发机制。
lmlmlmnew 2010-06-08
  • 打赏
  • 举报
回复
while(1)
{
//串口接收判断
if(USART_GetFlagStatus(USART2, USART_FLAG_RXNE))
{
//接收到1个char
acTempChar = 0;
acTempChar = (USART_ReceiveData(USART2) & 0xFF);//接收程序

acRecBuffer[aiNumber++] = acTempChar;

//当接收的数据个数超过协议的个数的时候,抛弃重新接收
if(aiNumber > CMD_SIZE ) //此处的CMD_SIZE相当于你开头的 EB 90 EB 90 4个字节
{
aiNumber = 0;
memset(acRecBuffer, 0, CMD_SIZE);
continue;
}

//检测,保留完整的协议数据
if((SYNC_CHARACTER == acRecBuffer[aiNumber - 1]) && (8!= aiNumber))
{
auNumOfSyncChar++;
}
else
{
//当本次接收的同步数据少于3个的时候,数据错误
//重新接收
//此处就是判断接收的数据和协议是否一样,不一样就抛弃,我这里的同步数据是3个0xaa
if(auNumOfSyncChar < 3)
{
aiNumber = 0;
memset(acRecBuffer, 0, CMD_SIZE);
auNumOfSyncChar = 0;
continue;
}
if(CMD_SIZE == aiNumber)
{
aiNumber = 0;
auNumOfSyncChar = 0;
giIdentify = ID_GPS_COM_PROT;
}
}

switch(giIdentify)
{
//协议处理函数
case ID_GPS_COM_PROT:
//这里替换为你的数据处理函数
DB_gbMainDataProcessFunction(*((ComProStr*)acRecBuffer));
aiNumber = 0;
memset(acRecBuffer, 0, CMD_SIZE);
giIdentify = 0;
break;
default:
break;
}
}
}

这是我的一个程序的下位机接收上位机协议并处理的函数,你改改就能适合你所说的情况了,关键是流程你看懂就ok了,另外你应该加个末尾判断的,不过和协议头判断的差不多。
kool86 2010-06-08
  • 打赏
  • 举报
回复
BUF[] = “0123456789”;
INT8U COUNT = 0;
TI = 1;

ISR()
{
if(COUNT == 10)停止
ELSE SBUF = BUF[COUNT ++];
}
yangjinCK 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jennyvenus 的回复:]
大脑是怎么理解的,程序就应该怎么写。
[/Quote]
不理解不知道怎么写

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧