2025-02-26 09:59:15 +00:00
|
|
|
|
### 测试
|
|
|
|
|
|
|
|
|
|
串口中断发送通过测试
|
|
|
|
|
|
|
|
|
|
spi_flash读写通过测试
|
|
|
|
|
|
|
|
|
|
对智能模块通信串口,阻塞发送数据通过测试。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 问题
|
|
|
|
|
|
2025-03-04 10:04:30 +00:00
|
|
|
|
#### 串口中断
|
2025-02-26 09:59:15 +00:00
|
|
|
|
|
|
|
|
|
25/02/24
|
|
|
|
|
|
|
|
|
|
在freerots环境下,中断不生效
|
|
|
|
|
|
2025-03-04 10:04:30 +00:00
|
|
|
|
解决
|
2025-02-26 09:59:15 +00:00
|
|
|
|
|
|
|
|
|
> 25/02/25
|
|
|
|
|
>
|
|
|
|
|
> 需要启动freerots任务
|
|
|
|
|
>
|
|
|
|
|
> 同时中断部分
|
|
|
|
|
>
|
|
|
|
|
> ```c
|
|
|
|
|
> void UART5_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
|
|
|
|
|
> ```
|
|
|
|
|
>
|
|
|
|
|
> 变为
|
|
|
|
|
>
|
|
|
|
|
> ```c
|
|
|
|
|
> void UART5_IRQHandler(void) __attribute__((interrupt()));
|
|
|
|
|
> ```
|
|
|
|
|
>
|
|
|
|
|
> 其他中断同上,由硬件压栈变为软件压栈
|
|
|
|
|
|
2025-03-04 10:04:30 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### 串口发送的数据不正确
|
|
|
|
|
|
|
|
|
|
25/02/28
|
|
|
|
|
|
|
|
|
|
解决
|
|
|
|
|
|
|
|
|
|
将数据通过队列发送,需要将buff的位置移动到起始位置+结构体长度
|
|
|
|
|
|
|
|
|
|
```c
|
|
|
|
|
uint8_t *Buff = (uint8_t *)pvPortMalloc(200);
|
|
|
|
|
if (Buff == NULL) {
|
|
|
|
|
log_error("Memory allocation failed\n");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
queueUartSendInfo *sendBuff = (queueUartSendInfo *)Buff;
|
|
|
|
|
sendBuff->length = sizeof("hello world\n");
|
|
|
|
|
sendBuff->data = Buff + sizeof(queueUartSendInfo);
|
|
|
|
|
strlcpy((char *)sendBuff->data, "hello world\n", sizeof("hello world\n"));
|
|
|
|
|
// for (int i = 0; i < sizeof("hello world\n"); i++) {
|
|
|
|
|
// sendBuff->data[i] = data[i];
|
|
|
|
|
// }
|
|
|
|
|
// *sendBuff->data = *data;
|
|
|
|
|
// *sendBuff->data = 'H';
|
|
|
|
|
|
|
|
|
|
log_info("dataLen:%d\n", sendBuff->length);
|
|
|
|
|
log_info("data:%s\n", sendBuff->data);
|
|
|
|
|
xQueueSend(upward_uart_Queue, &Buff, 10);
|
|
|
|
|
vTaskDelay(1000);
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### 中断中不能分配和释放内存
|
|
|
|
|
|
|
|
|
|
解决
|
|
|
|
|
|
|
|
|
|
中断中添加信号量,通知任务来释放。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 接收解析
|
|
|
|
|
|
|
|
|
|
#### su806传来的数据
|
|
|
|
|
|
|
|
|
|
见网关单片机通信协议
|
|
|
|
|
|
|
|
|
|
#### 传感器传来的数据
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-03-05 08:27:39 +00:00
|
|
|
|
## 串口接法流程
|
|
|
|
|
|
|
|
|
|
串口中断接收数据,接收到的数据放入缓冲buff中;当前为总线空闲状态时,接收到数据后立即总线为繁忙状态,并关闭软件定时器
|
|
|
|
|
|
|
|
|
|
串口发送数据前检查总线空闲状态和上次发送是否完成,总线空闲和上次发送完成,才能发送下次数据
|
|
|
|
|
|
|
|
|
|
中断发送数据,每发送一次数据则进入中断塞入下次发送的数据,当数据最后一个字节塞入完成后,设置二值信号量
|
|
|
|
|
|
|
|
|
|
二值信号量在任务中设置为队列集,有数据后设置发送完成,释放发送数据使用的buff
|
|
|
|
|
|
|
|
|
|
串口进入空闲中断后,使能软件定时器,定时到达后,设置总线空闲
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 串口接收传感器数据
|
|
|
|
|
|
2025-03-06 02:12:57 +00:00
|
|
|
|
100ms后,向上丢数据,或者空闲中断后向上丢数据
|
2025-03-04 10:04:30 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|