问题描述
我在理解我的代码如何工作时遇到问题。有人可以在输入'!'后向我解释为什么吗?在终端中字符 7 次我得到了我的文本 xxxxxx 和一大堆不同的奇怪字符。为什么它不以这个文本“xxxxxx”结尾???
#define UART_RX_BUF_SIZE 7
#define UART_TX_BUF_SIZE 7
int8_t uart_put_char(char data);
int8_t uart_get_char(char *data);
volatile char uart_rxBuff[UART_RX_BUF_SIZE];
volatile char uart_txBuff[UART_TX_BUF_SIZE];
void uart_put_string(char *s);
typedef struct {
volatile char *const buffer;
uint8_t head;
uint8_t tail;
} circ_buffer_t;
volatile circ_buffer_t uart_rx_circBuff = { uart_rxBuff,0 };
volatile circ_buffer_t uart_tx_circBuff = { uart_txBuff,0 };
int8_t uart_put_char(char data) {
uint8_t head_temp = uart_tx_circBuff.head + 1;
if (head_temp == UART_TX_BUF_SIZE)
head_temp = 0;
if (head_temp == uart_tx_circBuff.tail)
return 0;
uart_tx_circBuff.buffer[head_temp] = data;
uart_tx_circBuff.head = head_temp;
__HAL_UART_ENABLE_IT(&huart1,UART_IT_TXE);
return 0;
}
int8_t uart_get_char(char *data) {
if (uart_rx_circBuff.head == uart_rx_circBuff.tail)
return -1;
uart_rx_circBuff.tail++;
if (uart_rx_circBuff.tail == UART_RX_BUF_SIZE)
uart_rx_circBuff.tail = 0;
*data = uart_rx_circBuff.buffer[uart_rx_circBuff.tail];
return 0;
}
void uart_put_string(char *s) {
while (*s)
uart_put_char(*s++);
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USART1)
{
uint8_t head_temp = uart_rx_circBuff.head + 1;
if (head_temp == UART_RX_BUF_SIZE)
head_temp = 0;
if (head_temp == uart_rx_circBuff.tail) {
__HAL_UART_CLEAR_FLAG(&huart1,UART_IT_RXNE);
}
else {
HAL_UART_Receive_IT(&huart1,(uint8_t*) &uart_rx_circBuff.buffer[head_temp],1);
uart_rx_circBuff.head = head_temp;
}
if (uart_tx_circBuff.head == uart_tx_circBuff.tail) {
__HAL_UART_DISABLE_IT(&huart1,UART_IT_TXE);
} else {
uart_tx_circBuff.tail++;
if (uart_tx_circBuff.tail == UART_TX_BUF_SIZE)
uart_tx_circBuff.tail = 0;
HAL_UART_Transmit_IT(&huart1,(uint8_t*) &uart_tx_circBuff.buffer[uart_tx_circBuff.tail],1);
}
}
}
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_TIM10_Init();
uint8_t head_temp = uart_rx_circBuff.head + 1;
HAL_UART_Receive_IT(&huart1,1);
uart_rx_circBuff.head = head_temp;
while (1) {
char downloaded;
uart_get_char(&downloaded);
if(downloaded== '!'){
uart_put_string("xxxxxxxxxx");
}
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)