OpenEdv-开源电子网

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

STM32串口接收和发送的数据不一样问题

[复制链接]

2

主题

10

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-3-9
在线时间
3 小时
发表于 2016-6-20 16:11:35 | 显示全部楼层 |阅读模式
我需要控制一个数字舵机,再给它发送数据的时候需要同时接收发送的数据,硬件上是直接把接收发送端口连到一起的(用杜邦线),但在发送接收的过程中发现有时候接收到的和发送的不一样,目前还在纠结什么原因?有没有知道的,谢谢啦
附上部分程序:
发送函数中:
         for(bCount = 0; bCount < bPacketLength; bCount++)
         {
                 TxRS485(TxBuffer[bCount]);//把TxBuffer[]中数据送给USART1,顺便送到RxBuffer[]存起来
         }
CLEAR_BUFFER;//将数组指针清零方便下次存取  这个宏定义:#define CLEAR_BUFFER        RxBufferReadPointer = RxBufferWritePointer=0
接收中断中:
         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//读取接收完成中断标志位(接收寄存器满)
         {
                 TranslatedData = USART_ReceiveData(USART1);
                 while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == 1)//软件读DR中的数据后自动清0  USART_FLAG_RXNE
                  {               
                         uDelay(10);
                         if(ulCounter++ > RS485_TIMEOUT)
                         {
                                 bTimeout = 1;
                                 break;
                         }
                 }
                 RxInterruptBuffer[(RxBufferWritePointer)] = TranslatedData;
                 RxBufferWritePointer++;
中间那个是个对接收到的数据(字节)所用时间判断语句,测试发现根本没进入。这是另一个问题。

最后的结果就是接收发送有些数据不对
贴出一段接收发送的数据:

TxBuffer.1=255
RxInterruptBuffer.1=255
TxBuffer.2=1
RxInterruptBuffer.2=255
TxBuffer.3=5
RxInterruptBuffer.3=1
TxBuffer.4=3
RxInterruptBuffer.4=5
TxBuffer.5=8
RxInterruptBuffer.5=3
TxBuffer.6=255
RxInterruptBuffer.6=8
TxBuffer.7=3
RxInterruptBuffer.7=255
TxBuffer.8=236
RxInterruptBuffer.8=3
TxBuffer.0=255
RxInterruptBuffer.0=236
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2016-6-20 16:17:39 | 显示全部楼层
中断里为什么要有延时,还有的485的timeout时间是怎么去控制的,用延时吗,从程序里看是中断的次数自加。
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-3-9
在线时间
3 小时
 楼主| 发表于 2016-6-20 16:33:50 | 显示全部楼层
xyl210xyl 发表于 2016-6-20 16:17
中断里为什么要有延时,还有的485的timeout时间是怎么去控制的,用延时吗,从程序里看是中断的次数自加。

谢谢回答
中断里的延时是因为没想到检查接收字节时间的方法。用个延时,乘以延时次数,可以得到近似的接收时间,然后和规定的比较。
有个问题,中断次数的自加什么意思?
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-3-9
在线时间
3 小时
 楼主| 发表于 2016-6-20 16:47:33 | 显示全部楼层
xyl210xyl 发表于 2016-6-20 16:17
中断里为什么要有延时,还有的485的timeout时间是怎么去控制的,用延时吗,从程序里看是中断的次数自加。

中断里面可以有延时,我试过。可能会是中断性能变差,但此程序无其他地方使用次中断,近似不影响了
回复 支持 反对

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2016-6-21 09:46:14 | 显示全部楼层
步星辰 发表于 2016-6-20 16:33
谢谢回答
中断里的延时是因为没想到检查接收字节时间的方法。用个延时,乘以延时次数,可以得到近似的接 ...

接受字节时间控制用一个额外的定时器
回复 支持 反对

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2016-6-21 09:48:26 | 显示全部楼层
步星辰 发表于 2016-6-20 16:47
中断里面可以有延时,我试过。可能会是中断性能变差,但此程序无其他地方使用次中断,近似不影响了

中断与延时不共天,中断提升实时性,你又拿个延时来,,,用了中断就不需要延时
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-3-9
在线时间
3 小时
 楼主| 发表于 2016-6-21 22:27:23 | 显示全部楼层
xyl210xyl 发表于 2016-6-21 09:46
接受字节时间控制用一个额外的定时器

这个能说具体点吗?我看到有这种用法,但一直想不通也没找到定时器怎么用的
拜托了
回复 支持 反对

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2016-6-22 09:15:46 | 显示全部楼层
步星辰 发表于 2016-6-21 22:27
这个能说具体点吗?我看到有这种用法,但一直想不通也没找到定时器怎么用的
拜托了

定时器常用的用法就是设定时间,然后时间到了定时器会溢出中断, 如果你以9600的波特率去的传输的话,那么串口字与字时间间隔就是3.5ms(根据相应的波特率算出来的),也就是设置3.5ms的定时时间,实际应用中可以相应的延长这个时间间隔,我是8ms,因为数据在485 的相互转换中会有一定的粘滞,定时器在这里的作用就是检测这个3.5ms有没有到,到了就认为这一帧结束,不到继续收
回复 支持 反对

使用道具 举报

4

主题

290

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1130
金钱
1130
注册时间
2015-8-4
在线时间
107 小时
发表于 2016-6-22 09:20:00 | 显示全部楼层
TX485这个函数里面有没有等待发送完毕的判断?
比如这样:
void tx485(char *buffer)
{
int i=0;
for(i=0;i<strlen(buffer);i++)
{
uart_send(uart1,buffer[i]);
while(get_uart_flag(UART_FLAG_TC)==FLAG_RESET);//这里必须等待串口发送完当前字节才能进行下一个字节的发送,因为CPU比串口发送速度快多了!!
}
}
活到老,学到老。
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-3-9
在线时间
3 小时
 楼主| 发表于 2016-6-27 10:49:10 | 显示全部楼层
kingnike 发表于 2016-6-22 09:20
TX485这个函数里面有没有等待发送完毕的判断?
比如这样:
void tx485(char *buffer)

这个有的,看出点问题了,采集到的数据不同步,发送数组里的数据和接收数组里的错了一位,还在查找问题。
谢谢回答
回复 支持 反对

使用道具 举报

2

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
392
金钱
392
注册时间
2016-5-26
在线时间
35 小时
发表于 2016-6-27 14:29:16 | 显示全部楼层
你接收的数据很明显是上一次发送的数据,看看是不是延时的问题
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 18:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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