7381|11

7

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

关于stm32107和103的rs485通信 [复制链接]

写了主机和从机的程序,两块107可以进行询问——应答方式的485通信,现在把程序移植到103上面,不行。我是用数组保存数据帧的,在数据帧发送或接收完成前板子时钟保持发送或接收的状态。标志位用到的是TXE和RXNE,通过中断方式。把运行过程的中间参数发送到串口调试助手上看,发现接收到的数据帧(其实是一个个的字母组成)中间出现大量空格,字符串不能连续显示,也有接收的字符与显示的不一致。 请问是什么原因?跟两个芯片的时钟频率不一样有关吗?但我感觉好像系统里面都是配置到72M的。  求解,求解。。。
此帖出自stm32/stm8论坛

最新回复

USART_ITConfig(USART3,USART_IT_RXNE,DISABLE);了 结束了又没打开,只能收到一个字节 另外你在RxBuffer[RxCounter++] = RxChar ; 前面加多一句长度判断吧counter的超长判断。 如果你这样写 RxChar = USART_ReceiveData(USART3); RS232_SendData(RxChar); 你很容易就发现立即收发很容易出问题,一旦出问题了只能下电,下一次上电还未必能正常。我建议中间加多两到三条指令做为一个时间缓冲。我估计读出这个数据它是需要几个机器周期的,毕竟串口也慢,加几句话到中间占个读取时间。  详情 回复 发表于 2012-8-31 12:08
点赞 关注
 

回复
举报

1万

帖子

141

TA的资源

版主

沙发
 
先检查波特率问题
此帖出自stm32/stm8论坛

点评

都是9600,之前是在两块107的板上试过的程序,直接移植过来的  详情 回复 发表于 2012-8-29 17:29
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

回复 沙发 chunyang 的帖子

都是9600,之前是在两块107的板上试过的程序,直接移植过来的
此帖出自stm32/stm8论坛
 
 

回复

1万

帖子

141

TA的资源

版主

4
 
最好先确认,简单的办法是借用PC来观察,如果确认波特率没有问题,那么进一步分析是否因为内存容量的变化导致了冲突,看编译后的lst文件即可获知。
此帖出自stm32/stm8论坛

点评

哈哈,不知道是不是跟你说的情况一样。我定义的缓冲区数组是RxBuffer[RxCounter],RxCounter是自增的,正常接收的话RxCounter在收完一个数据帧后数值为9,实际上却变为了47,调试助手显示字符串中间出现很多来历无从  详情 回复 发表于 2012-8-30 00:56
 
 
 

回复

381

帖子

0

TA的资源

纯净的硅(高级)

5
 
为啥你不调试看看?
此帖出自stm32/stm8论坛

点评

就是用串口调试助手。。  详情 回复 发表于 2012-8-30 00:58
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

6
 

回复 4楼 chunyang 的帖子

哈哈,不知道是不是跟你说的情况一样。我定义的缓冲区数组是RxBuffer[RxCounter],RxCounter是自增的,正常接收的话RxCounter在收完一个数据帧后数值为9,实际上却变为了47,调试助手显示字符串中间出现很多来历无从考究的空格。但我在每次的接收中断里把刚接收到的字符用串口在调试助手上显示出来发现跟发送的又竟然一致。 所以不知道RxCounter=47和那些空格是怎么来的。
此帖出自stm32/stm8论坛
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

7
 

回复 5楼 虚V界 的帖子

就是用串口调试助手。。
此帖出自stm32/stm8论坛

点评

我说仿真器,数据接得怎么样的,时钟 波特率什么的不看得一清二楚么  详情 回复 发表于 2012-8-30 05:42
 
 
 

回复

381

帖子

0

TA的资源

纯净的硅(高级)

8
 

回复 7楼 731955123 的帖子

我说仿真器,数据接得怎么样的,时钟 波特率什么的不看得一清二楚么
此帖出自stm32/stm8论坛

点评

有用到。只是在接收中断里设置断点后再单步运行发现除了第一个字符 后面的字符是收不到的,这样好像没多大意思,所以直接用了printf在调试助手上显示。不知道是不是我不太熟练仿真器的使用。  详情 回复 发表于 2012-8-30 10:03
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

9
 

回复 8楼 虚V界 的帖子

有用到。只是在接收中断里设置断点后再单步运行发现除了第一个字符 后面的字符是收不到的,这样好像没多大意思,所以直接用了printf在调试助手上显示。不知道是不是我不太熟练仿真器的使用。
此帖出自stm32/stm8论坛
 
 
 

回复

381

帖子

0

TA的资源

纯净的硅(高级)

10
 
你在中断后面设断点,第一个都正确了,那后面的只关系到一些细节问题了
此帖出自stm32/stm8论坛

点评

if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) { RxChar = USART_ReceiveData(USART3); if(RxChar == \'E\') { RxBuffer[RxCounter++] = RxChar ; USART_ITConfig(USART3,USAR  详情 回复 发表于 2012-8-31 10:00
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

11
 

回复 10楼 虚V界 的帖子

if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
  {
        RxChar = USART_ReceiveData(USART3);       
        if(RxChar == 'E')
        {
            RxBuffer[RxCounter++] = RxChar ;
                USART_ITConfig(USART3,USART_IT_RXNE,DISABLE);
                flag = 1;
                RS232_SendData(RxChar);
                      for(i=0;i                         {
                        RS232_SendData(RxBuffer);
                        }
        }
        else
        {
                RxBuffer[RxCounter++] = RxChar ;
                RS232_SendData(RxChar);
        }


RS232_SendData 是电脑串口调试助手显示的函数,整个中断下来,显示的确实跟发送的一致,但是在帧尾‘E’后那个for循环函数显示的竟然与发送的不一样。RxCounter也变为47,正常的应为9.   IO口输出最高频率改过,波特率也试过降低,都没办法。  有一点,只要是103作为接收端接收数据的都会出现这种错乱,当它作为发送端时,107那边接收正常。
此帖出自stm32/stm8论坛
 
 
 

回复

381

帖子

0

TA的资源

纯净的硅(高级)

12
 
USART_ITConfig(USART3,USART_IT_RXNE,DISABLE);了
结束了又没打开,只能收到一个字节
另外你在RxBuffer[RxCounter++] = RxChar ; 前面加多一句长度判断吧counter的超长判断。
如果你这样写
RxChar = USART_ReceiveData(USART3);
RS232_SendData(RxChar);
你很容易就发现立即收发很容易出问题,一旦出问题了只能下电,下一次上电还未必能正常。我建议中间加多两到三条指令做为一个时间缓冲。我估计读出这个数据它是需要几个机器周期的,毕竟串口也慢,加几句话到中间占个读取时间。
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表