STC8G1K17 串口中断接收数据出错 | 已解决
7B 00 04 47 47 4B 5A 00 01 61 03 01 01 02 CB 6B 这是中断接收的数据帧打印信息,7B后面本来应该直接跟04,现在多出来个00!!! 注意此数据帧校验正常,发送数据也正常,只在接收时出现此问题。接收程序代码如下:
/**
* @brief中断服务函数
* @param无
* @retval 无
*/
void UART2_ISR_Handler (void) interrupt UART2_VECTOR
{
if(RI2)
{
CLR_RI2();
if(Busy_UartRxd == 0)
{
ZYLoRa_buff = S2BUF;
Timer_Multiple_timings(USART2_RxTimeOut_NO,5);
}
else
{
/* 清除缓存标志 */
memset(ZYLoRa_buff,0,ZYLoRa_p);
ZYLoRa_SendStr_length(ZYLoRa_buff,ZYLoRa_p); //返回接收信息
ZYLoRa_p = 0;
}
}
if(TI2)
{
CLR_TI2();
Busy_uartii = 0; //
}
}
【新提醒】求STC8系列4个串口同时通信的程序,Modbus 演示程序 - 串行口,DMA支持的4组串口,RS232,RS485 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
我这样写不对?
//========================================================================
// 函数: void UART2_int (void) interrupt UART2_VECTOR
// 描述: 串口2中断函数
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2018-4-2
// 备注:
//========================================================================
void UART2_int (void) interrupt UART2_VECTOR
{
if(RI2)
{
CLR_RI2();
RX2_Buffer = S2BUF;
if(++RX2_write >= RX2_Length) RX2_write = 0;
}
if(TI2)
{
CLR_TI2();
B_TX2_Busy = 0;
}
} 你们程序这样写的,我不明白哪里错了。 神农鼎 发表于 2023-10-26 13:52
【新提醒】求STC8系列4个串口同时通信的程序,Modbus 演示程序 - 串行口,DMA支持的4组串口,RS232,RS48 ...
鼎,想问一下STC32G官方库函数里面的UART部分,里面的
#define PRINTF_SELECTUART1 //选择 printf 函数所使用的串口,参数 UART1~UART4
这个函数,可不可以同时使用多个串口使用printf?
比如同时让多个串口在一个程序里面使用库里面定义的printf这样的。
如果可以的话,应该怎么修改啊?可不可以给个例子或修改说明呢?
谢谢~ 本帖最后由 乘风飞扬 于 2023-10-31 15:35 编辑
9DHans 发表于 2023-10-30 22:06
鼎,想问一下STC32G官方库函数里面的UART部分,里面的
这个函数,可不可以同时使用多个串口使用printf? ...
STC32G库函数 "STC32G_UART.c" 文件末尾是重写 putchar 函数将 printf 映射到指定串口的方法:
#if(PRINTF_SELECT == 1)
char putchar(char c)
{
TX1_write2buff(c);
return c;
}
#elif(PRINTF_SELECT == 2)
char putchar(char c)
{
TX2_write2buff(c);
return c;
}
#elif(PRINTF_SELECT == 3)
char putchar(char c)
{
TX3_write2buff(c);
return c;
}
#elif(PRINTF_SELECT == 4)
char putchar(char c)
{
TX4_write2buff(c);
return c;
}
#endif
如果想多串口使用 printf 就需要进行重新封装了,例如通过一个全局变量来判断当前使用哪个串口打印。
9DHans 发表于 2023-10-30 22:06
鼎,想问一下STC32G官方库函数里面的UART部分,里面的
这个函数,可不可以同时使用多个串口使用printf? ...
附件提供一种多串口使用 printf 方式重新封装打印函数的例子,请参考
void UART1_printf(char *fmt,...)
{
u32 i,length;
va_list ap;
va_start(ap,fmt);
vsprintf(usart_txBuff,fmt,ap);
va_end(ap);
length=strlen((const char*)usart_txBuff);
for(i=0;i<length;i++)
{
SBUF= usart_txBuff;
while(TI == 0);
TI = 0; //Clear Tx flag
}
} 乘风飞扬 发表于 2023-10-31 15:36
附件提供一种多串口使用 printf 方式重新封装打印函数的例子,请参考
非常感谢老师的指导
页:
[1]