### 测试

串口中断发送通过测试

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传来的数据

见网关单片机通信协议

#### 传感器传来的数据





## 串口接法流程

串口中断接收数据，接收到的数据放入缓冲buff中；当前为总线空闲状态时，接收到数据后立即总线为繁忙状态，并关闭软件定时器

串口发送数据前检查总线空闲状态和上次发送是否完成，总线空闲和上次发送完成，才能发送下次数据

中断发送数据，每发送一次数据则进入中断塞入下次发送的数据，当数据最后一个字节塞入完成后，设置二值信号量

二值信号量在任务中设置为队列集，有数据后设置发送完成，释放发送数据使用的buff

串口进入空闲中断后，使能软件定时器，定时到达后，设置总线空闲



## 串口接收传感器数据





