打印
[STM32F1]

串口发送这个帧的程序咋写?

[复制链接]
1571|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
stly|  楼主 | 2018-6-27 17:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问一下,用stm32串口发送这几个数据,电压和电流是未知的,还必须还这个帧的格式写,串口发送这个帧的程序咋写?
沙发
chuxh| | 2018-6-27 17:40 | 只看该作者

哪儿啊?我怎么没有找到。。。

使用特权

评论回复
板凳
xxrs| | 2018-6-27 17:42 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
地板
stly|  楼主 | 2018-6-27 17:43 | 只看该作者
USART_SendData(USART1,0x3A);
   USART_SendData(USART1,result);
   USART_SendData(USART1,result1);
   USART_SendData(USART1,result+result1);
   USART_SendData(USART1,0x0D);
   USART_SendData(USART1,0x0A);
这个程序有误,望大神不惜赐教

使用特权

评论回复
5
stly|  楼主 | 2018-6-27 17:44 | 只看该作者

这个自己写的,不合适

使用特权

评论回复
6
yinxiangh| | 2018-6-27 17:45 | 只看该作者

估计result是电压,result1是电流。
USART_SendData(USART1,0x3A);
   USART_SendData(USART1,(result>>4)+0x30);
USART_SendData(USART1,(result&0x0f)+0x30);
   USART_SendData(USART1,(result1>>4)+0x30);
USART_SendData(USART1,(result1&0x0f)+0x30);
   USART_SendData(USART1,((result+result1)>>4)+0x30);
USART_SendData(USART1,((result+result1)&0x0f)+0x30);
   USART_SendData(USART1,0x0D);
   USART_SendData(USART1,0x0A);

使用特权

评论回复
7
ousj| | 2018-6-27 17:47 | 只看该作者
:dizzy:  表示要吐了    0X360X34 两个十六进制字节   先转成ASC码10进制6和4   然后又拼合转回十六进制 0X64  最后意思就是0X64对应的值100

使用特权

评论回复
8
stly|  楼主 | 2018-6-27 17:49 | 只看该作者
恩恩,result是电压,result是电流,试了一下你的程序合适了,谢谢了

使用特权

评论回复
9
stly|  楼主 | 2018-6-27 17:50 | 只看该作者

对啊,这个也把我纠结坏了,太恶心了

使用特权

评论回复
10
zwll| | 2018-6-27 17:51 | 只看该作者
Modbus ASCII格式

使用特权

评论回复
11
chuxh| | 2018-6-27 17:52 | 只看该作者

类似于modbus ASCII。缺少ID啊。自定的协议吗?

使用特权

评论回复
12
stly|  楼主 | 2018-6-27 17:54 | 只看该作者
恩恩,是自定的协议,上面的程序挺合适的,只要在发送每一句数据的时候加一个延时程序就没问题了,不延时我试了一下还真不行

使用特权

评论回复
13
renyaq| | 2018-6-27 17:56 | 只看该作者
因为你在发送前没有判断标志位、、、

使用特权

评论回复
14
supernan| | 2018-6-27 17:57 | 只看该作者
uint8_t voltage=100;
uint8_t current=200;
uint8_t CheckSum=0;

CheckSum=voltage+current;
printf("\"%03u%03u%03u\r\n",voltage,current,CheckSum);

使用特权

评论回复
15
renyaq| | 2018-6-27 17:58 | 只看该作者
看21ic 公开课 stm32入门到精通 大面积讲串口...你要的里面讲过...

使用特权

评论回复
16
houcs| | 2018-6-27 17:59 | 只看该作者
这个最好先建立一个数组空间,将需要发送的数据存储在数组空间中。完成之后,关闭其他高优先级的中断,调用串口发送函数一次发送。单片机上是16进制,而PC机通常需要ASCII码,所以PC机上看到的1、2、3之类的数字其实是由0x31、0x32、0x33这些ASCII码转换来的。同样要把单片机中的0x64(即100)发送给PC机,就需要发送(1+0x30、0+0x30、0+0x30)三个ASCII码值。

使用特权

评论回复
17
stly|  楼主 | 2018-6-27 18:00 | 只看该作者
好的,我明天去单位试一下,多谢各位大侠了哈,结贴了先

使用特权

评论回复
18
junpeng324| | 2018-6-27 21:40 | 只看该作者
这个需要自己封装吧

使用特权

评论回复
19
CaLipton| | 2018-6-30 15:39 | 只看该作者
发送前有没有判断标志位

使用特权

评论回复
20
stm32jy| | 2018-6-30 15:50 | 只看该作者
加标志位啊,这个自己可以定义一个简单的协议

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

433

主题

7058

帖子

0

粉丝