本帖最后由 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【】的数据读出来发现整体左移,第一个数据掉到最后一个位置去了
求大神来解决一波,实在没找到好的办法,我在想是不是延时或者的问题
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>