stm8l052c6t6 模拟串口 接收异常
现在我的模拟串口和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 以外, 我没有开其他中断啊,降低波特率也不行, 搞了好多天, 求大神们给我支支招啊,万分感谢!!!!
别模拟了
串口不够就换芯片
模拟的比较耗时间,要中断全部关闭,最好还是用自带的串口 有时后换芯片不是好办法啊,譬如我有一个应用需要7个串口,哪有这么多的? 尝试一下,把数据包分成8个字节为一组,
每次只发一组,然后延时一段时间,大约20ms吧,
再继续发下一组,看看能不能解决问题。
页:
[1]