2.4 KiB
2.4 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
串口进入空闲中断后,使能软件定时器,定时到达后,设置总线空闲