用的是nuc100ve3an,用串口0与PC机通讯,PC机通过以太网传输数据,
数据经一个以太网转串口模块与nuc的串口0连接。程序中采用中断方式接收
串口数据。目前串口中断可响应,响应后也收到数据,但数据中每个字节内容
不对,数据帧长度也与发送端不一致。
后面将以太网转串口模块的输出接了一个rs232转换芯片接到另一台电脑串口上,
用串口精灵查看,发现接收的数据都正确,看来上位机和以太网转串口模块没
问题,问题应该还是在nuc的板子上。
下面是串口部分的程序,求教大家看看。
int main(void)
{
//串口部分初始化
UNLOCKREG(); //解锁寄存器
DrvSYS_SetOscCtrl(E_SYS_XTL12M,1); //使能外部12M晶振
DrvSYS_SetOscCtrl(E_SYS_OSC22M,1); //使能内部22M晶振
Delay_Loop(200); //适当延时
DrvSYS_SelectHCLKSource(0); //设置外部12Mhz晶振作为时钟源
DrvSYS_SetClockDivider(E_SYS_HCLK_DIV,0); //设置HCLK时钟频率=12MHz/(0+1)=12MHz,SPI时钟基准
DrvGPIO_InitFunction(E_FUNC_UART0_RX_TX); //GPIO初始化为UART0
DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC,0x03);//选择外部22.1184MHz晶振作为3组UART时钟基准
DrvSYS_SetClockDivider(E_SYS_UART_DIV,1);//基准再分,UART时钟为11.0592MHz
sParam0.u32BaudRate=57600;
sParam0.u8cParity=DRVUART_PARITY_NONE;
sParam0.u8cDataBits=DRVUART_DATABITS_8;
sParam0.u8cStopBits=DRVUART_STOPBITS_1;
sParam0.u8cRxTriggerLevel=DRVUART_FIFO_1BYTES;
sParam0.u8TimeOut=0;
DrvUART_Open(UART_PORT0,&sParam0); //UART0参数设置,波特率、字节数量、停止位、FIFO字节大小
tUART= (UART_T *)((uint32_t)UART0+UART_PORT0);
tUART->IER.RDA_IEN=1; //接收中断使能
NVIC_EnableIRQ(UART0_IRQn); //使能UART0
LOCKREG(); //锁定寄存器
while(1)
{
//其它程序循环部分
}
//串口中断函数
void UART02_IRQHandler(void)
{
//user add
UART_T * tUART0; //UART0指针
UART_T * tUART2; //UART2指针
uint8_t content; //临时数据存储
/*---------------------------------------------------*/
uint32_t u32uart0IntStatus,u32uart2IntStatus;
u32uart0IntStatus = inpw(&UART0->ISR) ;
u32uart2IntStatus = inpw(&UART2->ISR) ;
if(g_pfnUART0callback != NULL)
{
g_pfnUART0callback(u32uart0IntStatus);
}
if(g_pfnUART2callback != NULL)
{
g_pfnUART2callback(u32uart2IntStatus);
}
//user add
tUART0 = (UART_T *)((uint32_t)UART0 + UART_PORT0);
tUART2 = (UART_T *)((uint32_t)UART0 + UART_PORT2);
if((tUART0->ISR.RDA_INT)&&(tUART0->ISR.RDA_IF)) //串口0接收中断
{
content=UART0->DATA;
Buffer_ReceivePC[Buffer_ReceivePCIndex]=content;
Buffer_ReceivePCIndex++;
if(Buffer_ReceivePCIndex==(0x06))
{
Buffer_ReceivePCIndex=0x00;
}
} |