最近公司一个项目,使用的核心板是原子哥的F767,自己设计了外部电路,现在在串口通讯是有点问题无法解决。
其中用到几个串口,和定时器,其中串口1是和上位机通讯,串口1的优先级最高,抢占优先级是1,其他串口和定时器都是2和3,串口1需要将ADC采集的数据每100ms一次上传给上位机;同时接收上位机的控制指令。串口1我只打开了接收中断,在接受中断中的唯一操作是将接收到的字节存入到我事先准备好的缓存数组中。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART1)
{
UART1_RX_BUF[++UART1_ReceiveBuf_Count] = aRxBuffer_UART1[0]; //将接收到的字节存入自己定义的接收缓存数组中
if(UART1_ReceiveBuf_Count%50==0) LED1_Toggle;
}
每次ADC采集完成(100ms),将采集的值存入到我自己定义的发送缓存数组中,串口1的发送是循环发送,主循环中每次最多发送一个字节,主循环很快。
if(ADC_Sampling_Enable==0) //1组采样完成
{
Vin1=2.5*ADS1251_Read_middle(ADC_Sample)/0x7fffff;
ADC_Sampling_Enable=1; //开启下一组采样
UART1_DisposalTemp[0]='?'; //头
UART1_DisposalTemp[1]='1'; //表示主板的信息
UART1_DisposalTemp[2]='1'; //表示测量的电压
UART1_DisposalTemp[3]='1'; //对应的档位
ADC_float_to_ascll(Vin1,UART1_DisposalTemp) ;
UART1_DisposalTemp[11]='#';
//printf(urt_disposaltemp);
for(i=0;i<12;i++)
{
UART1_TX_BUF[++UART1_SendBuf_Count]=UART1_DisposalTemp[i]; //ADC采样值存入到自己定义的发送缓存数组中,等待发送
}
}
if(UART1_SendBuf_Count!=UART1_SendBuf_Current) //main循环中发送串口数据,此处每次最多发一个字节
{
HAL_UART_Transmit(&UART1_Handler,(uint8_t*)(&UART1_TX_BUF[++UART1_SendBuf_Current]),1,1000); //发送接收到的数据
while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET); //等待发送结束
}
问题如下:
串口1发送没问题,但是接收一段时间后会出现无法接收的现象,程序没有卡死,因为串口还在定时发送,但是就是无法进入串口接收中断。当我串口不发送时(把这句注释掉://UART1_TX_BUF[++UART1_SendBuf_Count]=UART1_DisposalTemp[i]; ),则串口接收就没问题。一开始以为接收中断是不是打开,调试时确认没打开(TXEIE和TCIE都是0);请教,这个可能是什么原因?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
我习惯用寄存器。。。
你说下你的一个简单测试方法,我按你的方法来写代码。
最简单可以复现这个bug的
一周热门 更多>