OpenEdv-开源电子网

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

串口2与串口3的通信有问题

[复制链接]

2

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
322
金钱
322
注册时间
2020-11-21
在线时间
50 小时
发表于 2021-4-28 16:59:05 | 显示全部楼层 |阅读模式
2金钱
本帖最后由 爱学习的Yang 于 2021-4-28 17:04 编辑

用串口调试助手给串口2(A板)发送消息,串口2(A板)将消息传递给串口3(A板),然后串口3(A板)把消息发送给串口3(B板),串口3(B板)再将消息传递给串口2(B板),最后串口2(B板)再发送给电脑。目前可以实现串口调试助手与串口2(A板)的通信,但是不知为何串口2(A板)与串口3(A板)之间不能通信,代码如下,希望各位前辈指点一下。
  1. int main(void)
  2. {
  3.         u8 t;  //typedef unsigned char uint8_t;
  4.         u8 reclen;        
  5.         u16 times=0;  //typedef unsigned short uint16_t;
  6.         SystemInit(); //系统时钟配置函数,通过不同的时钟定义,来选择不同的主频  
  7.             LED_Init();
  8.             delay_init();
  9.             NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);     
  10.             Nvic_Init();
  11.         TIM1_PWM_Init(899,0);        
  12.         usart2_init(9600);         //串口初始化为9600
  13.         uart3_init(9600);         //串口初始化为9600           
  14.         LED1=1;
  15.   while(1)
  16.         {                           
  17.                         if(USART2_RX_STA&0x8000)   
  18.                 {                                          
  19.                         reclen=USART2_RX_STA&0x3fff;//得到此次接收到的数据长度
  20.                         USART2_RX_BUF[reclen]=0;                 //加入结束符
  21.                         for(t=0;t<reclen;t++)
  22.                         {                              
  23.                                 USART_SendData(USART3, USART2_RX_BUF[t]);         //向串口3发送数据
  24.                                 while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束                     
  25.                         }
  26.                         u2_printf("\r\n\r\n");//插入换行
  27.                         u2_printf("USART2_RX_BUF:%s\r\n",USART2_RX_BUF);
  28.                         u2_printf("reclen:%d\r\n",reclen);
  29.                                  if(strcmp((char*)USART2_RX_BUF,"电机1停止")==0)
  30.                                         {
  31.                                                   HALL_Flag=0;                        
  32.                                                       u2_printf("\r\n电机1停止\r\n");
  33.                                         }
  34.                                          if(strcmp((char*)USART2_RX_BUF,"电机1正转")==0)
  35.                                         {
  36.                                                   HALL_Flag=1;                        
  37.                                                       u2_printf("\r\n电机1正转\r\n");
  38.                                         }
  39.                                          if(strcmp((char*)USART2_RX_BUF,"电机1反转")==0)
  40.                                         {
  41.                                                   HALL_Flag=2;                        
  42.                                                       u2_printf("\r\n电机1反转\r\n");
  43.                                         }
  44.                         USART2_RX_STA=0;                                                                              
  45.                 }
  46.                  if(USART3_RX_STA&0X8000)                        //接收到一次数据了
  47.                 {
  48.                          reclen=USART3_RX_STA&0X3FFF;        //得到数据长度
  49.                         USART3_RX_BUF[reclen]=0;                 //加入结束符
  50.                         for(t=0;t<reclen;t++)
  51.                         {                           
  52.                                 USART_SendData(USART2, USART3_RX_BUF[t]);         //向串口2发送数据
  53.                                 while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);//等待发送结束            
  54.                 }                                       
  55.                         USART3_RX_STA=0;               
  56.                 }
  57.                 else
  58.                 {
  59.                         times++;
  60.                         if(times%200==0)u2_printf("请输入指令,以回车键结束\r\n");  
  61.                         if(times%30==0)LED1=!LED1;//闪烁LED,提示系统正在运行.
  62.                         delay_ms(10);                              
  63.         }            
  64. }
  65. }
  66. void USART2_IRQHandler(void)                        //串口2中断服务程序
  67.         {
  68.         u8 Res;
  69.         if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
  70.                 {
  71.                         Res =USART_ReceiveData(USART2);        //读取接收到的数据
  72.                         while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);//等待发送结束
  73.                         if((USART2_RX_STA&0x8000)==0)//接收未完成
  74.                                 {
  75.                                 if(USART2_RX_STA&0x4000)//接收到了0x0d
  76.                                         {
  77.                                                 if(Res!=0x0a)USART2_RX_STA=0;//接收错误,重新开始
  78.                                                 else USART2_RX_STA|=0x8000;        //接收完成了
  79.                                         }
  80.                                 else //还没收到0X0D
  81.                                         {        
  82.                                                 if(Res==0x0d)USART2_RX_STA|=0x4000;
  83.                                                 else
  84.                                                         {
  85.                                                                 USART2_RX_BUF[USART2_RX_STA&0X3FFF]=Res ;
  86.                                                                 USART2_RX_STA++;
  87.                                                                 if(USART2_RX_STA>(USART2_MAX_RECV_LEN-1))USART2_RX_STA=0;//接收数据错误,重新开始接收         
  88.                                                         }                 
  89.                                         }
  90.                                 }                    
  91.                 }
  92. }
  93. void USART3_IRQHandler(void)                        //串口3中断服务程序
  94.         {
  95.         u8 Res;
  96.         if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
  97.                 {
  98.                 Res =USART_ReceiveData(USART3);        //读取接收到的数据

  99.                 if((USART3_RX_STA&0x8000)==0)//接收未完成
  100.                         {
  101.                         if(USART3_RX_STA&0x4000)//接收到了0x0d
  102.                                 {
  103.                                 if(Res!=0x0a)USART3_RX_STA=0;//接收错误,重新开始
  104.                                 else USART3_RX_STA|=0x8000;        //接收完成了
  105.                                 }
  106.                         else //还没收到0X0D
  107.                                 {        
  108.                                 if(Res==0x0d)USART3_RX_STA|=0x4000;
  109.                                 else
  110.                                         {
  111.                                         USART3_RX_BUF[USART3_RX_STA&0X3FFF]=Res ;
  112.                                         USART3_RX_STA++;
  113.                                         if(USART3_RX_STA>(USART_REC_LEN-1))USART3_RX_STA=0;//接收数据错误,重新开始接收         
  114.                                         }                 
  115.                                 }
  116.                         }                    
  117.      }

  118. }
复制代码



最佳答案

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

将串口2和串口3的中断服务函数进行了修改,已经成功解决问题。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
322
金钱
322
注册时间
2020-11-21
在线时间
50 小时
 楼主| 发表于 2021-4-28 16:59:06 | 显示全部楼层
将串口2和串口3的中断服务函数进行了修改,已经成功解决问题。
回复

使用道具 举报

15

主题

1061

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
3625
金钱
3625
注册时间
2019-8-14
在线时间
1054 小时
发表于 2021-4-28 18:24:47 | 显示全部楼层
检查下串口3有没有可以正常通信,2板子间串口通信参考下这个【战舰V3/精英板子实现两板子间的串口通信测试程序(串口2间的通信)】 http://www.openedv.com/forum.php?mod=viewthread&tid=285874
回复

使用道具 举报

2

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
322
金钱
322
注册时间
2020-11-21
在线时间
50 小时
 楼主| 发表于 2021-4-29 09:51:25 | 显示全部楼层
hou18 发表于 2021-4-28 18:24
检查下串口3有没有可以正常通信,2板子间串口通信参考下这个【战舰V3/精英板子实现两板子间的串口通信测试 ...

好像是串口2(A板)不能把接收的消息发送给串口3(A板),我参考的就是这篇帖子。
回复

使用道具 举报

6

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
464
金钱
464
注册时间
2021-4-28
在线时间
158 小时
发表于 2021-4-29 10:05:40 | 显示全部楼层
共地了没有
回复

使用道具 举报

2

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
322
金钱
322
注册时间
2020-11-21
在线时间
50 小时
 楼主| 发表于 2021-4-29 10:14:24 | 显示全部楼层

共地了啊
回复

使用道具 举报

6

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
464
金钱
464
注册时间
2021-4-28
在线时间
158 小时
发表于 2021-4-29 10:16:27 | 显示全部楼层
建议先把功能拆分,先单个功能测试,再合并起来
回复

使用道具 举报

12

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
922
金钱
922
注册时间
2018-7-18
在线时间
385 小时
发表于 2021-4-29 10:19:38 | 显示全部楼层
你的逻辑有问题呀   
电脑连接A板串口2   还想串口2发送数据到串口3 ???
首先  你的串口2连接的是电脑 不是串口3肯定不能发  其次同一块板子  串口2 接收的数据是不需要在发到串口3的 直接就可以用串口3发送到B板的  
回复

使用道具 举报

30

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2020-4-17
在线时间
111 小时
发表于 2021-4-29 10:33:53 | 显示全部楼层
wwhh 发表于 2021-4-29 10:19
你的逻辑有问题呀   
电脑连接A板串口2   还想串口2发送数据到串口3 ???
首先  你的串口2连接的是电 ...

没问题,可以这样做,只是他的程序或接线有误或串口有问题而已
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 16:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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