小知识点记录:-> 运算为 成员选择(指针)使用形式:对象指针->成员名 例如: x = p->a;这句话的意思就是取出p所指向的结构体中包含的数据项a赋值给x
想要单片机接收上位机发送的长数据,但是单片机每次的接收发送都只有一个字节,那么就只能通过修改接收代码来实现目标。 前提打开串口接收中断 按照正点原子的串口实验例程移植以后 得到如下的判断帧尾的程序 思路大致是——检查当前的数据是否为特定的两个目标数据,如果数据是0x0d,将USART_RX_STA置1,在下一次循环中检测当前数据是否为0x0a。两个特定数据先后检测到才判断一次数据全部接收完成。 这两个数据可以自己来设定。 以下为中断执行函数: 其中uart_getchar()函数是接收一个字节的库 uart_putchar()函数是发送一个字节的库
uint8 USART_RX_BUF[USART_REC_LEN];
uint16 USART_RX_STA=0;
void uart1_interrupt_handler (void)
{
uint8 dat;
uart_getchar(UART_1, &dat);
if((USART_RX_STA&0x8000)==0)
{
if(USART_RX_STA&0x4000)
{
if(dat!=0x0a)USART_RX_STA=0;
else USART_RX_STA|=0x8000;
}
else
{
if(dat==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=dat ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;
}
}
}
}
我在写完程序之后发现传输数据还是有问题,以为是代码有问题。偶然看到一篇博文发现电压电流的不稳定以为是硬件的问题,再经过一系列的排查之后发现是中断优先级的问题,由于其他中断函数的优先级高于串口中断的优先级,所以也会导致数据的收发过程中被打断,导致数据丢失。
以上。 再贴一个自己修改后用于判断帧头然后发送接收到的数据的程序
void classify_command()
{
uint16 len ,t;
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3fff;
if(USART_RX_BUF[0] == '1')
{
printf("\r\n您发送的消息为:\r\n\r\n");
for(t=0;t<len;t++)
{
uart_putchar(UART_1, USART_RX_BUF[t]);
USART_RX_BUF[t] = 0;
}
printf("\r\n\r\n");
}
else printf("\r\n数据错误\r\n\r\n");
USART_RX_STA=0;
}
}
|