请问如果我想实现CH554串口UART1接收,发送引脚作为普通IO口。串口接收完成后,控制TX脚拉高拉低,再接收,再控制TX脚拉高拉低。。。。如此循环。
能否实现这样的功能?
如果可以实现,需要注意什么?
谢谢!!
请问如果我想实现CH554串口UART1接收,发送引脚作为普通IO口。串口接收完成后,控制TX脚拉高拉低,再接收,再控制TX脚拉高拉低。。。。如此循环。
能否实现这样的功能?
如果可以实现,需要注意什么?
谢谢!!
1、可以实现的,在UART1的RX功能正常的时候,操作P1寄存器可以正常的控制P17端口的高低电平。
2、直接正常操作P17位就可以
感谢!我发现串口接收处理完成后,调用mDelaymS()延时120ms,但是上位机一直以100ms发送数据,有概率造成串口死掉,请问有发现过这种问题吗?谢谢!
#include "..\Public\CH554.H"
#include "..\Public\Debug.H"
#include "./GPIO/GPIO.h"
#include "UART_TEST.h"
#include "UART1.H"
#include "stdio.h"
#include
#pragma NOAREGS
UINT8 cmmnctRcvDataOffset;
UINT8 gCmmnRevDataBuf[COM_REC_PACK_LENGTH];//接收数据缓存
/*********************************************************************
* @fn UartRecIRQHandler
*
* @brief 串口中断处理函数
*
* @param none
*
* @return none
*/
void UartRecIRQHandler(UINT8 _recdata)
{
if(cmmnctRcvDataOffset >= COM_REC_PACK_LENGTH)
{
cmmnctRcvDataOffset = 0;
}
gCmmnRevDataBuf[cmmnctRcvDataOffset++] = _recdata;
if(cmmnctRcvDataOffset == 2 && (gCmmnRevDataBuf[0] != CMMNCT_HEADER1 || gCmmnRevDataBuf[1] != CMMNCT_HEADER2))
{
cmmnctRcvDataOffset = 0;
}
}
/*********************************************************************
* @fn CommRevPacket
*
* @brief 接收数据处理函数
*
* @param none
*
* @return none
*/
UINT8 CommRevPacket(void)
{
if(cmmnctRcvDataOffset >= 32)
{
EA = 0;
cmmnctRcvDataOffset = 0;
EA = 1;
mDelaymS(120);
printf("rec\n");
}
return 0;
}
/*********************************************************************
* @fn PeripheralUartInit
*
* @brief 串口初始化
*
* @param none
*
* @return none
*/
void PeripheralUartInit(void)
{
UART1Init();
}
我在串口例程中加入上面的代码,CommRevPacket在main里轮询,UartRecIRQHandler()在串口中断处理。上位机一直以100ms发送数据,这样串口就会死掉,发送没有反应了,工程已经上传,在最上方
在您的代码基础上加上了一些打印信息,电脑端串口模块的TX接P1.6RXD1,电脑端串口模块RX接P3.1监控打印信息
电脑端发送一个字节数据可以收回7个字节的打印信息。
电脑端配置成100ms发送一个字节数据,发送752字节数据,收到了5264字节打印信息,同时会看打印信息,数据接收全部正确。串口接收、中断功能本身功能应该是没有问题的,可以再查一下应用代码逻辑是否有问题。