OpenEdv-开源电子网

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

关于STM32双机串口通信先后开机结果不同的问题

[复制链接]

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-6-4
在线时间
12 小时
发表于 2017-8-14 22:33:31 | 显示全部楼层 |阅读模式
20金钱
本帖最后由 yiweijian 于 2017-8-15 13:45 编辑

关于STM32双机通信的串口的问题,我把发送函数放在主函数无限循环,然后接收机(接收的串口中断是最高优先级)接收,这个时候,有两种情况:
1.先开接收端电源,再开发送端,接到的缓冲区数组整体数据左移了一位
2.先开发送端,再开接收端,数据正确
不断用复位键模拟重新上电一直是这样。

发送端函数:
int main(void)
{        
         
        delay_init();                     //延时函数初始化
        uart1_init(9600);                 //串口初始化为9600         
        uart2_init(9600);        
        NVIC_Configuration();        //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        OLED_Init();

        while(1)
        {        
                delay_ms(1000);
                send1();  //发送数据
               
        }

}
void send1()    //每次进来一个12位数据,拆分成低八位和高八位,组合成一个新数组sendbuff用来进行串口发送。注:串口先发的是低八位
{
        u8 n;
        for(n=0;n<9;n++)
     {

                sendbuff[2*n]=(u8)(gather[n]&(0x00ff));
                sendbuff[2*n+1]=(u8)((gather[n]>>8)&(0x00ff));

                USART_SendData(USART1,sendbuff[2*n]);                   //发低位
                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);        //等待发送结束        


                USART_SendData(USART1,sendbuff[2*n+1]);                   //发高位`
                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);        //等待发送结束        
        }


接收端中断服务函数:
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
                {
                        Res =USART_ReceiveData(USART1);        //读取接收到的数据
                        
                        USART_RX_BUF1[l]=Res;       //将数据放入数组
                        l++;
                        
                        if(l==18)                                //发完18个数据
                        {               
                         l=0;                                        //清除长度
                        for(x=0;x<9;x++)
                        receivebuff[x]=(((u16)USART_RX_BUF1[2*x])+(((u16)USART_RX_BUF1[2*x+1])<<8));  //恢复16位数据
                        for(x=0;x<18;x++)
                         USART_RX_BUF1[x]=0;  //清空缓冲区
                        }        
                }


如果是先开接收端,再开发送端,将接收端数组USART_RX_BUF1【】的数据读出来发现整体左移,第一个数据掉到最后一个位置去了




求大神来解决一波,实在没找到好的办法,我在想是不是延时或者的问题

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-6-4
在线时间
12 小时
 楼主| 发表于 2017-8-15 00:09:24 | 显示全部楼层
实际中当然是满足这种接收对的情况,当然是先开发送,再开接收。
但是为啥反过来就出问题呢,个人觉得应该从时间上来理解,但是还是没想通
回复

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2018-6-8
在线时间
18 小时
发表于 2018-6-13 10:07:51 | 显示全部楼层
大哥,请问这个是如何解决的,我最近做一个SPI主从设备通讯。必须先启动从机。主机后启动。之后发现后启动主机会出现问题。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-26 11:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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