单片机串口通讯的问题请教
第一次在单片机上写与PC通讯的程序想了好久,有个问题不能解决,想请各位大侠指教:因为PC机上发送的数据的时间是不定的而在单片机上用了循环来不断重复检测好多东东,其中之一是...
第一次在单片机上写与PC通讯的程序
想了好久,有个问题不能解决,想请各位大侠指教:
因为PC机上发送的数据的时间是不定的
而在单片机上用了循环来不断重复检测好多东东,其中之一是PC来的资料,准备用中断来处理
PC也不总是发数据,只是点击某个按键才发送的(比如 四个数字)
现在的问题是:我如何才知道,中断收到的数据是四个数字中的第一个?
在两方面的编程如何处理才行?
在PC的编程上我习惯用时间间隔发送而非mscomm事件发送,是否是问题的原因
按我的理解协议是表明每个数字的意义及作用
现在我在PC上有一个按钮,我一按就发送四个数字
如01H,00H,00H,00H,前面一位想表示要求单片机做的动作,后面是时间
这样的协议有问题吗?
具体的做法应该如何?
谢谢 展开
想了好久,有个问题不能解决,想请各位大侠指教:
因为PC机上发送的数据的时间是不定的
而在单片机上用了循环来不断重复检测好多东东,其中之一是PC来的资料,准备用中断来处理
PC也不总是发数据,只是点击某个按键才发送的(比如 四个数字)
现在的问题是:我如何才知道,中断收到的数据是四个数字中的第一个?
在两方面的编程如何处理才行?
在PC的编程上我习惯用时间间隔发送而非mscomm事件发送,是否是问题的原因
按我的理解协议是表明每个数字的意义及作用
现在我在PC上有一个按钮,我一按就发送四个数字
如01H,00H,00H,00H,前面一位想表示要求单片机做的动作,后面是时间
这样的协议有问题吗?
具体的做法应该如何?
谢谢 展开
3个回答
展开全部
协议理论上没问题,建议增加校验字节,避免误动作。
你的重点是识别接收到字节的序号,或者说,如何知道是第一个字节。常用有三种方法:
1、通过时间间隔判断,由于你需求的是响应按键,而相邻两次按键有较长的间隔,该方法可行。
2、通过串行通讯的第九位识别,单片机第九位往往用于多机通讯,该位为1,表示地址信息,尼克作为第一个字节的标记。问题是PC机的第九位是校验位,而校验位是自动产生的,不易满足要求。
3、通过特殊定义的识别码。按照你的设计思路,第一个字节表示动作,后面三个字节表示时间,而时间无需占用一个字节的256个编码,比如说,年可只设置100年,0~99,月只需0~12,日只需0~31,时只需0~23,分和秒只需0~59。那么,你用100以上的数据表示指令就可以了。这样,收到大于100的数据就是第一个字节,表示动作。
如果加校验字节,校验字节也可能产生大于100的数据,是不是?你可变通一下,采用7位校验,最高位强制为0,而指令码(动作)采用128以上编码。校验码可采用简单的和校验,即前面四个字节的和(可能为两字节,只取低字节),再屏蔽最高位(置位为0)。
第三种方法最简单。不过,建议你尝试第一种方法,这种方法通用性最强,实际应用最多。
你的重点是识别接收到字节的序号,或者说,如何知道是第一个字节。常用有三种方法:
1、通过时间间隔判断,由于你需求的是响应按键,而相邻两次按键有较长的间隔,该方法可行。
2、通过串行通讯的第九位识别,单片机第九位往往用于多机通讯,该位为1,表示地址信息,尼克作为第一个字节的标记。问题是PC机的第九位是校验位,而校验位是自动产生的,不易满足要求。
3、通过特殊定义的识别码。按照你的设计思路,第一个字节表示动作,后面三个字节表示时间,而时间无需占用一个字节的256个编码,比如说,年可只设置100年,0~99,月只需0~12,日只需0~31,时只需0~23,分和秒只需0~59。那么,你用100以上的数据表示指令就可以了。这样,收到大于100的数据就是第一个字节,表示动作。
如果加校验字节,校验字节也可能产生大于100的数据,是不是?你可变通一下,采用7位校验,最高位强制为0,而指令码(动作)采用128以上编码。校验码可采用简单的和校验,即前面四个字节的和(可能为两字节,只取低字节),再屏蔽最高位(置位为0)。
第三种方法最简单。不过,建议你尝试第一种方法,这种方法通用性最强,实际应用最多。
展开全部
如果指令数据长度固定的 你这样也可以 但最好加 校验码 不然会出错
如果指令数据长度不定的 可以这样
指令识别码 指令 数据1 数据2 ----- 数据n 校验码 结束码
如果多机通讯 还要加 分机号
如果指令数据长度不定的 可以这样
指令识别码 指令 数据1 数据2 ----- 数据n 校验码 结束码
如果多机通讯 还要加 分机号
追问
现在只要固定长度就可以,就是四位,但后面的几个数字的大小就不知道了
现在最大的问题就是在单片机中我不知道如何确定现在是收到第几个数
比如收到的第一个数,放在3BH中,之后3CH 3DH,3EH,不知道第一个数字,所以不知道什么时候收为来的数放在哪里
收来的数也不知是否全了,假设PC只发了三个数就掉电了,又要如何呢?
我的程序里还有串口2的中断,T0的中断,
问的比较菜,请指点,谢谢
追答
所以要用指令识别码,开始计数,数据1 数据2 ----- 数据n
收到 结束码后 等待下一指令
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你定义一个缓冲区(把从PC传来的数据存起来)然后再定义个指针,指针指向你所需要的字节,然后提取这个指针所指向的地址的内容
追问
现在我指定了四个内容来放置PC传来的数据 每收到一个指针加1, 够四个清零
但要是如前所讲PC掉电了来的数不对,后面再来的数就永远不对了?
追答
我也是做工控的,你这样做通信是不太好的
我们一般都采取主从通信,就是上传一串数,上位机才会回传一串数据,这样你想想就不会存在你说的掉电问题了
而且工控现场的电都是经过UPS的,哪会随便掉电
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询