2.8 KiB
2.8 KiB
测试
串口中断发送通过测试
spi_flash读写通过测试
对智能模块通信串口,阻塞发送数据通过测试。
问题
串口中断
25/02/24
在freerots环境下,中断不生效
解决
25/02/25
需要启动freerots任务
同时中断部分
void UART5_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
变为
void UART5_IRQHandler(void) __attribute__((interrupt()));
其他中断同上,由硬件压栈变为软件压栈
串口发送的数据不正确
25/02/28
解决
将数据通过队列发送,需要将buff的位置移动到起始位置+结构体长度
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
串口进入空闲中断后,使能软件定时器,定时到达后,设置总线空闲
串口接收传感器数据
100ms后,向上丢数据,或者空闲中断后向上丢数据
测试指令
查询端口0电源数据
53 4C 00 00 11 53 4C 11 11 11 11 11 11 11 30 01 00 00 0C 23 68 16 17
查询端口1倾角传感器数据
53 4C 01 00 09 4A 59 09 00 02 01 01 05 b5 17
打开端口1电源
47 57 10 00 03 00 01 00 01 18 9C 16
查看端口1电源
47 57 30 00 03 00 01 27 50 16