现在程序有一个问题,就是我的接收中断为
[C] 纯文本查看 复制代码 void USER_USART1_IRQHandler(void)
{
uint8_t data = 0;
if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET)
{
data = (uint8_t)USART1->RDR & (uint8_t)0x00fff;
wrEleQueue(&uart[_COM1].Rx, data);
uart[_COM1].active = true;
// __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE);
}
// if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE))
// {
// uart[_COM1].flag = 1;
// __HAL_UART_CLEAR_IDLEFLAG(&huart1);
// }
}
然后我有一个发送数据的函数,但是现在我的接收中断接收不到数据,里面一直为空,为什么?主函数里面也调用了__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
[C] 纯文本查看 复制代码 int SendDataUART(const char *s, uint32 number, COM_TypeDef com)
{
UART_HandleTypeDef *p;
uint8_t *data = NULL;
p = getUARTPtr(com);
if (!p)
return _ERR;
wrBlockQueue(&uart[com].Tx, (uint8_t *)s, number);//将s写入到环形缓冲区中,写number个数据
int len = QueueLen(uart[_COM1].Tx);//求环形缓冲区的长度
data = (uint8_t *)calloc(len + 1, sizeof(uint8_t));
if (!data)
return _ERR;
rdBlockQueue(data, &uart[com].Tx, len);//将环形缓冲区中的数据读出来,读len个长度
HAL_UART_Transmit(&huart1, data, len, 500);
free(data);
return _OK;
/* 本意是想使用这个来触发HAL_UART_TxCpltCallback回调函数,但是最后测试也不行 */
// UART_HandleTypeDef *p;
// p = getUARTPtr(com);
// if (!p)
// return _ERR;
// wrBlockQueue(&(uart[com].Tx), (uint8_t *)s, number);
// if ((__HAL_UART_GET_FLAG(p, UART_FLAG_BUSY) == RESET) || (__HAL_UART_GET_FLAG(p, UART_FLAG_TXE)))
// {
// uint8_t dat = 0;
// rdEleQueue(&(uart[com].Tx), &dat);
// // p->Instance->CR1 = (p->Instance->CR1 & (~(1 << 3))) | (1 << 3);
// HAL_UART_Transmit_IT(p, &dat, 1);
// // USART1->TDR = (uint8_t)dat;
// }
// return _OK;
}
[C] 纯文本查看 复制代码
回调函数为
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
uint8_t dat;
if (huart->Instance == USART1)
{
if (!isEmptyQueue(uart[_COM1].Tx))
{
rdEleQueue(&(uart[_COM1].Tx), &dat);//从环形缓冲区中读取一个元素
// huart->Instance->CR1 = (huart->Instance->CR1 & (~(1 << 3))) | (1 << 3);
HAL_UART_Transmit_IT(&huart1, &dat, 1);
// USART1->TDR = (uint8_t)dat;
}
// else
// huart->Instance->CR1 = (huart->Instance->CR1 & (~(1 << 3)));
}
}
|