遇到一个串口2和串口1互相影响的问题【已解决】
本帖最后由 STCAI-32位8051 于 2024-4-12 14:36 编辑我使用的单片机是STC8H1K08
内存编译后情况如下
Program Size: data=9.2 xdata=606 const=0 code=6498
我的代码基本功能就是接受串口2的数据,然后进行和校验,校验通过后通过串口1输出数据
代码如下
u8 Co2Analysis(void)
{
u8 i,check;
u16 CO2_PPM;
if(COM2.RX_TimeOut > 0) //超时计数
{
if(--COM2.RX_TimeOut == 0)
{
if(COM2.RX_Cnt > 0)
{
check = FunCheckSum(RX2_Buffer,9); //收到的数据进行校验
if(check == RX2_Buffer)//如果校验通过就通过串口1 输出数据
{
CO2_PPM = RX2_Buffer*256+RX2_Buffer;
/**/
RS485_MODE_TX;
RX1_Buffer = CO2_PPM>>8;
RX1_Buffer = CO2_PPM&0xFF;
for(i=0; i<2; i++)
{
TX1_write2buff(RX1_Buffer); //使用串口1发送数据
}
delay_ms(100);
/**/
}
/**问题代码块**/
//使用串口2发送数据
// for(i=0; i<COM2.RX_Cnt; i++)
// {
// TX2_write2buff(RX2_Buffer); //收到的数据原样返回
// }
/**问题代码块**/
}
COM2.RX_Cnt = 0;
}
}
return 0;
}
现在遇到的问题就是,
1、如果屏蔽掉问题代码块,那么串口1就不会有数据输出
2、如果不屏蔽问题代码块,即使进行和校验判断,那么串口1也会正常输出数据
3、如果屏蔽掉问题代码块,也屏蔽掉“if(check == RX2_Buffer)//如果校验通过就通过串口1 输出数据”,这个和校验判断,串口1也会正常输出数据
问题代码块也就是一个串口2的数据输出,似乎影响到了RX2_Buffer里面的数据,
现在搞不明白,请大家指导
先调整一下代码:TXx_write2buff(RXx_Buffer);加一个下标TXx_write2buff(RXx_Buffer);然后再调试 本帖最后由 Dwyer 于 2024-4-11 11:27 编辑
55337575 发表于 2024-4-11 10:55
先调整一下代码:TXx_write2buff(RXx_Buffer);加一个下标TXx_write2buff(RXx_Buffer);然后再调试 ...
这个应该是有的
TX1_write2buff(RX1_Buffer); //使用串口1发送数据
编辑状态下有,发送出来就没有了,应该是网站问题
我重新用代码的模块编辑了一下
本帖最后由 STCAI-32位8051 于 2024-4-11 13:13 编辑
用STC8H串口例程测试下
本帖最后由 Dwyer 于 2024-4-11 14:56 编辑
STCAI-32位8051 发表于 2024-4-11 13:11
用STC8H串口例程测试下
版主你好,感谢回复,我用例程跑过,串口1和2全部正常,现在我是删除了一些其他功能的代码,只跑串口那部分,也不正常,我想请问代码量的多少会影响程序导致一些意外状况吗?目前我串口用的是库函数的那个例程去写的。
删减后的代码,编译大小是
Program Size: data=9.2 xdata=558 const=0 code=4141
更正一下,删减程序后还是不正常
Dwyer 发表于 2024-4-11 13:29
版主你好,感谢回复,我用例程跑过,串口1和2全部正常,现在我是删除了一些其他功能的代码,只跑串口那部 ...
异常的情况就放慢速度,加几个nop 国学芯用 发表于 2024-4-11 14:22
异常的情况就放慢速度,加几个nop
nop 是要加在哪个地方?
仿真一下看看,应该是软件问题 原因已经查明,是因为没有加延时,我再回头看官方的例程时发现在while(1)循环中有个1ms的延时,所以我在程序中加上这个延时就OK了,
但是我还是觉得官方的例程应该对这个1ms的延时要做一下解释,难道是因为数据没有发送完毕就执行了下一段程序导致了错误?
附上官方例程的代码
void main(void)
{
u8 i;
EAXSFR(); /* 扩展寄存器访问使能 */
GPIO_config();
UART_config();
EA = 1;
PrintString2("STC8 UART2 Test Programme!\r\n"); //UART2发送一个字符串
while (1)
{
delay_ms(1);
if(COM2.RX_TimeOut > 0) //超时计数
{
if(--COM2.RX_TimeOut == 0)
{
if(COM2.RX_Cnt > 0)
{
for(i=0; i<COM2.RX_Cnt; i++) TX2_write2buff(RX2_Buffer); //收到的数据原样返回
}
COM2.RX_Cnt = 0;
}
}
}
}
页:
[1]