OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8116|回复: 12

stm32f103单片机串口连续发送多字节程序求助

[复制链接]

4

主题

13

帖子

0

精华

高级会员

Rank: 4

积分
553
金钱
553
注册时间
2018-8-15
在线时间
109 小时
发表于 2021-5-6 16:05:00 | 显示全部楼层 |阅读模式
5金钱
stm32f103单片机做通信控制,发送的数据总是不对。抄了网上各种发送程序,禁止编译器优化等都试遍了。实在不知道错在哪里,请网友帮忙指教。比如说我要发送的数据:0x5a  0xa5  0x03  0x10  0x20  0x30  ;
上面0x5a  0xa5是帧头,0x03是后面要发送的数据量(这里是3个), 0x10  0x20  0x30  就是要发送的数据了。
下面的图片是我试着从发送一个字节到发送7个字节时收到了数据截图,好给大伙分析;
最先发送一个字节,是外围接了一个按钮,按一次发送一次。


发送一个字节后串口助手接收到正确的数据


从一次发送两个字节开始接收就不对了


第一次按按钮,接收到的是0x5a。没错,第一次只能收到一个字节,按道理应该接收到0x5a  0xa5。从第二次开始接收到的数据时0xa5  0x5a,这是一次收到了两个字节但反了顺序。不知道程序错在哪里,求指点!


后面是发送3个字节


没让我失望,接收的还是2个字节。但从这里开始,接收到的都已经不是原来发送了的数据了。发送的0x5a  0xa5  0x03已经变成了0x5a  0x3f两个字节了。


后面的我也懒得打字了,都是少了一个字节。0xa5  0x03 都变成了 0x3f。
















请大神们帮我分析一下问题出在哪里了?

最佳答案

查看完整内容[请看2#楼]

谢谢!问题不在那里,你说的方法我试过了,一样的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

13

帖子

0

精华

高级会员

Rank: 4

积分
553
金钱
553
注册时间
2018-8-15
在线时间
109 小时
 楼主| 发表于 2021-5-6 16:05:01 | 显示全部楼层
xkwy 发表于 2021-5-6 17:29
发送前判断串口TXE就可以了,把TC的while判断去掉

谢谢!问题不在那里,你说的方法我试过了,一样的。
回复

使用道具 举报

4

主题

13

帖子

0

精华

高级会员

Rank: 4

积分
553
金钱
553
注册时间
2018-8-15
在线时间
109 小时
 楼主| 发表于 2021-5-6 16:05:30 | 显示全部楼层
求一份可以一次正确发送多字节的程序范例,稍微改一下还能发送MODBUS协议的多字节程序。
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2021-5-6 17:29:16 | 显示全部楼层
发送前判断串口TXE就可以了,把TC的while判断去掉
回复

使用道具 举报

9

主题

219

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1430
金钱
1430
注册时间
2020-5-12
在线时间
393 小时
发表于 2021-5-6 22:36:27 | 显示全部楼层
用dma发送,简单快捷还不阻塞
回复

使用道具 举报

12

主题

3389

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8645
金钱
8645
注册时间
2020-5-11
在线时间
4100 小时
发表于 2021-5-7 09:05:40 | 显示全部楼层
本帖最后由 LcwSwust 于 2021-5-7 10:35 编辑

xkwy说得也对,但这个问题的原因估计不在这。
我曾遇到过USB转串口线出现数据出错的情况,是USB转串口线的问题,换根线就对了。
还曾遇到过串口助手不正常的,换个串口助手就对了。
最后建议用示波器看波形,通过波形判断数据是否正确、波特率是否准确。
---------
补充说明,若是485通信,收发切换如果没处理好也会影响数据,所以最好还是要用示波器看下波形。

专治疑难杂症
回复

使用道具 举报

11

主题

2147

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4894
金钱
4894
注册时间
2015-1-10
在线时间
612 小时
发表于 2021-5-7 09:46:02 | 显示全部楼层
每次出错都出错在发送第二和第三个字节上,那就是在发送这两个字节的时候MCU出了什么问题,我倒不觉得是硬件的问题,应该是软件的问题,建议把其他部分注释掉,只留下串口部分再测试
回复

使用道具 举报

4

主题

13

帖子

0

精华

高级会员

Rank: 4

积分
553
金钱
553
注册时间
2018-8-15
在线时间
109 小时
 楼主| 发表于 2021-5-9 09:26:28 | 显示全部楼层
LcwSwust 发表于 2021-5-7 09:05
xkwy说得也对,但这个问题的原因估计不在这。
我曾遇到过USB转串口线出现数据出错的情况,是USB转串口线的 ...

我一业余爱好者,没有示波器。
回复

使用道具 举报

4

主题

13

帖子

0

精华

高级会员

Rank: 4

积分
553
金钱
553
注册时间
2018-8-15
在线时间
109 小时
 楼主| 发表于 2021-5-9 09:47:39 | 显示全部楼层
阿侑kevin 发表于 2021-5-7 09:46
每次出错都出错在发送第二和第三个字节上,那就是在发送这两个字节的时候MCU出了什么问题,我倒不觉得是硬 ...

我也觉得是程序哪里有错,我找不到在哪里。我把帧头换成0x0f  0xf0 后,收到的是0x0f  0x3f。
回复

使用道具 举报

4

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2019-4-9
在线时间
79 小时
发表于 2021-5-10 10:44:29 | 显示全部楼层
你串口中断函数怎么写的。程序中for循环中2个while去掉,只有可以发送数据
回复

使用道具 举报

4

主题

912

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4508
金钱
4508
注册时间
2019-9-4
在线时间
914 小时
发表于 2021-5-10 10:51:57 | 显示全部楼层
你修改一下顺序,先判断TXE,然后发送,再判断TC
回复

使用道具 举报

4

主题

13

帖子

0

精华

高级会员

Rank: 4

积分
553
金钱
553
注册时间
2018-8-15
在线时间
109 小时
 楼主| 发表于 2021-5-10 20:34:28 | 显示全部楼层
A571157242 发表于 2021-5-10 10:51
你修改一下顺序,先判断TXE,然后发送,再判断TC

那些都试过了,一样的。我想把波特率改小再试试看。
回复

使用道具 举报

17

主题

587

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4467
金钱
4467
注册时间
2013-6-27
在线时间
565 小时
发表于 2021-5-10 22:12:13 | 显示全部楼层
串口初始化参数有没问题  停止位 校验等参数
让我们的思维驾驭在电的速度之上!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 09:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表