在进行串口接收数据的实验里,用原子哥提供的usart.c,波特率115200,修改的地方如下:
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _ttywrch(int ch)
{
ch = ch;
}
void _sys_exit(int x)
{
x = x;
}
这里添加void _ttywrch(int ch) 是为了防止报错,另外一个改动的地方在回调函数里面:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART1)//如果是串口1
{
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(aRxBuffer[0]!=0x0a)
{
USART_RX_STA=0;//接收错误,重新开始
printf("接收错误,重新开始
");
}
else USART_RX_STA|=0x8000; //接收完成了
}
else //还没收到0X0D
{
if(aRxBuffer[0]==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=aRxBuffer[0];
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))
{
USART_RX_STA=0;//接收数据错误,重新开始接收
printf("接收数据错误,重新开始接收
");
}
printf("USART_RX_STA = %d aRxBuffer = %c
", USART_RX_STA, aRxBuffer[0]);
}
}
}
}
}
这里添加printf是为了分析错误原因。主函数里面循环为:
while(1)
{
if(USART_RX_STA&0x8000)
{
printf("发送的数据为:
");
HAL_UART_Transmit(&UART1_Handler, (u8*)USART_RX_BUF, USART_RX_STA&0X3FFF, 1000);
while(__HAL_UART_GET_FLAG(&UART1_Handler, UART_FLAG_TC)!=SET);
printf("
");
USART_RX_STA=0;
}
}
下载到板子里,发送数据为12345,发送新行,打印出的消息是这样的:
delay_ms(1000) = 1000.23 ms[2018-12-16 10:32:09.463]
USART_RX_STA = 1 aRxBuffer = 1[2018-12-16 10:32:12.549]
发送的数据为:[2018-12-16 10:32:14.703]
1[2018-12-16 10:32:14.703]
USART_RX_STA = 1 aRxBuffer = 1[2018-12-16 10:32:15.027]
USART_RX_STA = 2 aRxBuffer = 2[2018-12-16 10:32:16.040]
USART_RX_STA = 3 aRxBuffer =
[2018-12-16 10:32:17.075]
USART_RX_STA = 4 aRxBuffer = 2[2018-12-16 10:32:17.941]
USART_RX_STA = 5 aRxBuffer = 3[2018-12-16 10:32:18.592]
USART_RX_STA = 6 aRxBuffer = 3[2018-12-16 10:32:19.153]
USART_RX_STA = 7 aRxBuffer = 3[2018-12-16 10:32:19.641]
USART_RX_STA = 8 aRxBuffer = 1[2018-12-16 10:32:20.112]
USART_RX_STA = 9 aRxBuffer = 4[2018-12-16 10:32:20.560]
USART_RX_STA = 10 aRxBuffer = 4[2018-12-16 10:32:21.156]
USART_RX_STA = 11 aRxBuffer = 1[2018-12-16 10:32:27.179]
USART_RX_STA = 12 aRxBuffer = 4[2018-12-16 10:32:28.158]
每点一下发送按钮,就打印一行信息。猜想程序接收到1个字符后没有继续接收。
请各位大神指点。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>