gateway_mcu/README.md

120 lines
2.4 KiB
Markdown
Raw Normal View History

### 测试
串口中断发送通过测试
spi_flash读写通过测试
对智能模块通信串口,阻塞发送数据通过测试。
### 问题
#### 串口中断
25/02/24
在freerots环境下中断不生效
解决
> 25/02/25
>
> 需要启动freerots任务
>
> 同时中断部分
>
> ```c
> void UART5_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
> ```
>
> 变为
>
> ```c
> void UART5_IRQHandler(void) __attribute__((interrupt()));
> ```
>
> 其他中断同上,由硬件压栈变为软件压栈
#### 串口发送的数据不正确
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
串口进入空闲中断后,使能软件定时器,定时到达后,设置总线空闲
## 串口接收传感器数据