c - STM32F103RB Nucleo收发usart
问题描述
我在使用 usart 进行传输和接收时遇到了一些问题。我要传输的第一个信息被写入循环缓冲区。然后发送信息,但丢失了一些信息。
变量
enum {
BUF_SIZE = 100
};
char BUF_T[BUF_SIZE], BUF_R[BUF_SIZE];
uint8_t R_EMPTY = 0, R_BUSY = 0, T_EMPTY = 0, T_BUSY = 0;
传输
void Send(void) {
uint8_t index = T_EMPTY;
for (int i = 0; i < 10; i++) {
BUF_T[index] = i+'0';
index++;
if (index >= BUF_SIZE) {
index = 0;
}
}
__disable_irq();
if (T_BUSY == T_EMPTY
&& __HAL_UART_GET_FLAG(&huart2,UART_FLAG_TXE) == SET) {
T_EMPTY = index;
T_BUSY++;
uint8_t tmp = BUF_T[T_BUSY];
if (T_BUSY >= BUF_SIZE) {
T_BUSY = 0;
}
HAL_UART_Transmit_IT(&huart2, (uint8_t*) &tmp, 1);
} else {
T_EMPTY = index;
}
__enable_irq();
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
//if (huart->Instance == USART2) {
if (T_BUSY != T_EMPTY) {
__disable_irq();
T_BUSY++;
uint8_t tmp = BUF_T[T_BUSY];
if (T_BUSY >= BUF_SIZE) {
T_BUSY = 0;
}
HAL_UART_Transmit_IT(&huart2, (uint8_t*) &tmp, 1);
__enable_irq();
}else {
Send();
}
//}
}
从图片中可以看出,有时会丢失一个字符。我不明白为什么?
关于接收,有人可以告诉mi是否可以吗?
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
//if (huart->Instance == USART2) {
uint8_t tmp = BUF_R[R_EMPTY];
R_EMPTY++;
if (R_EMPTY >= BUF_SIZE) {
R_EMPTY = 0;
}
HAL_UART_Receive_IT(&huart2, (uint8_t*) &tmp, 1);
//}
}
解决方案
推荐阅读
- swift - Swift 中两个 UITableViewController 之间的导航控制器
- c# - 带有自定义键盘扩展的非字母数字按键?(Xamarin iOS)
- android - 如何在订阅中返回值
- html - Wordpress HTML 和简码问题
- docker - 如何从终端查看保存的 Docker 日志,颜色解析和格式与 Docker 日志显示的方式相同?
- npm - 为什么我不能从终端运行我的节点包?
- java - Java JNA u32t 返回值的指针(内存)
- javascript - 访问隐藏字段数组值时出现问题
- list - 从 SAS 数据集中删除具有全零值的变量
- git - 将 git 设置为始终提示输入凭据