单片机/MCUwilliam hill官网
直播中

黑眼圈红了

9年用户 109经验值
擅长:可编程逻辑 嵌入式技术 模拟技术 EMC/EMI设计 接口/总线/驱动
私信 关注
[问答]

求助单片机串口通信的问题

使用串口调试助手做串口通信,使用的单片机型号是STC15F2K60S2,写了一个返回接收到的数据的程序,然而,实际调试时,两位数的可以正常接收显示,一旦发送3位数,串口就只能接收到分开的数据,比如用串口调试助手发送111,接收回来显示的是11  01,试过好多次都是这样。求助大神请问是哪里出问题了呢?
  • 调试助手
  • 串口初始化
  • 串口发送字节
  • 串口中断服务程序

回帖(11)

blust

2016-11-14 10:42:13

最佳答案

你是在接收中断里面直接调用发送函数,在连续接收时可能会导致数据发送与接收冲突,从而丢失数据。最好是在接收中断里做一个标志位,然后在主程序里面调用发送函数。或者等一组数据接收完之后再整体发送回去。
举报

blust

2016-11-14 11:44:14
本帖最后由 blust 于 2016-11-14 11:45 编辑

你调试时选择的是HEX模式,这个模式是十六进制表示的,你发11时其实不是发送的11,而是十六进制数0x11,换成十进制数就是17,是一个字节,所以不会错。但是你发111时,按照十六进制的解析就是前一个字节是0x11,后一个字节由于你只输了一位,默认高位为0,就是0x01,所以你接收到的就是11 01 ,并没有错误。
举报

blust

2016-11-14 11:44:56
如果你发送区接收区都选成文本模式,就不会出现这个情况了。
举报

黑眼圈红了

2016-11-14 13:33:38
引用: blust 发表于 2016-11-14 11:44
如果你发送区接收区都选成文本模式,就不会出现这个情况了。

试了,发送文本模式的话有时候能接到有时候接不到完整数据,比如我发一个120过去,接收到的是12。
举报

黑眼圈红了

2016-11-14 13:38:44
引用: blust 发表于 2016-11-14 11:44
你调试时选择的是HEX模式,这个模式是十六进制表示的,你发11时其实不是发送的11,而是十六进制数0x11,换成十进制数就是17,是一个字节,所以不会错。但是你发111时,按照十六进制的解析就是前一个字节是0x11,后一个字节由于你只输了一位,默认高位为0,就是0x01,所以你接收到的就是11 01 ,并没有错误。 ...

意思就是我选择HEX模式发送的话,那我写进缓存区的数据就是用十六进制表示的是吧,我这样试了一下,发送一个字节最大的数FF,确实是可以接收回来的。
举报

blust

2016-11-14 15:27:28
引用: 黑眼圈红了 发表于 2016-11-14 13:38
意思就是我选择HEX模式发送的话,那我写进缓存区的数据就是用十六进制表示的是吧,我这样试了一下,发送一个字节最大的数FF,确实是可以接收回来的。

是的,十六进制就是从00到FF
举报

蒋明红

2016-11-14 23:13:09
你的程序没有问题,你在发送的时候是发送的16进制数据,你输入的是111其实系统默认变成1101 。你输入11 01 结果也一样。至于你在文本模式下,有时候能接受到有时不能接受到应该是你单片机没有处理过来,因为你在接收里有在发送,建议你做数据断帧处理,然后将接收到数据全部发送出去。数据断帧处理代码你要的话可以免费提供(95186869@qq.com)
举报

张大力

2016-11-15 08:54:57
楼上解释的精辟
举报

黑眼圈红了

2016-11-15 16:56:06
引用: blust 发表于 2016-11-14 15:32
你是在接收中断里面直接调用发送函数,在连续接收时可能会导致数据发送与接收冲突,从而丢失数据。最好是在接收中断里做一个标志位,然后在主程序里面调用发送函数。或者等一组数据接收完之后再整体发送回去。

恍然大悟.jpg   谢谢指导。
举报

黑眼圈红了

2016-11-15 16:57:48
引用: mingmingge8991 发表于 2016-11-14 23:13
你的程序没有问题,你在发送的时候是发送的16进制数据,你输入的是111其实系统默认变成1101 。你输入11 01 结果也一样。至于你在文本模式下,有时候能接受到有时不能接受到应该是你单片机没有处理过来,因为你在接收里有在发送,建议你做数据断帧处理,然后将接收到数据全部发送出去。数据断帧处理代码你要的话可以免费提供 ...

谢谢,如果可以的话,代码我也想要。
举报

hong_ace

2016-11-19 00:54:09
单片机的缓冲寄存器是8位 你要发多位数字的话得写循环或检测有没有发送完成。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分