现在我的模拟串口和PC端通信正常, 和我们的光电模块终端通信的时候,接收的数据有问题, 但是截取报文, pc解析正常,说明还是我的串口解析的问题。 以下是pc 解析的数据(正确的) FE FE FE 68 10 14 00 00 00 00 00 00 81 09 90 1F 00 00 07 01 00 00 FF CC 16 我的串口解析的数据: FE FE FE 68 10 14 00 00 00 00 00 00 81 4B 90 FB 1C 00 07 01 00 00 FF 63 B3 FC 我的思路是接收引脚外部中断,进入中断后关闭中断, 延时一段时间, 开启定时器, 依次检测引脚电平, 读完8个数据位后,开始时钟同步,即检测一个下降沿,开始下一个字节的读取。 以下是我的时钟同步部分代码 /* * 同步串口时钟 */ unsigned long my_count = 0; void sync_clock(void) { BitStatus old_val, new_val; disableInterrupts(); old_val = read_rx_line(); disableInterrupts(); while(my_count< 5000) { new_val = read_rx_line(); // 检测到下降沿,即起始位 if(old_val == SET && new_val== RESET) break; old_val = new_val; my_count++; } my_count = 0; enableInterrupts(); rx_flag = 0; //stop timer TIM3->CR1 &= (uint8_t)(~TIM_CR1_CEN); TIM3->CR1 &= ~TIM_CR1_CEN; TIM3->CNTRH = 0;//timer3_val >> 8; TIM3->CNTRL = 5;//timer3_val & 0xff; TIM3->CR1 |= TIM_CR1_CEN; } 我有以下疑问, 异步通信每一个字节都是相互独立的,每个字节停止位都进行了时钟同步,不存在累积误差,前面的数据正常, 中间的数据突然异常, 初步断定是中断引起的, 但是除了用于产生接收中断的定时器3 以外, 我没有开其他中断啊,降低波特率也不行, 搞了好多天, 求大神们给我支支招啊,万分感谢!!!! |
串口不够就换芯片
评分
查看全部评分
评分
查看全部评分
每次只发一组,然后延时一段时间,大约20ms吧,
再继续发下一组,看看能不能解决问题。
评分
查看全部评分