完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
uint8_t ComInBuf[128];
uint8_t ComOutBuf[128]; uint8_t ComOrderData[9]; //接收到的命令 uint8_t ComOrderDataBuf[9]; //接收到的命令缓存 uint8_t SendDataNum; //需要发送的实际数据个数 uint8_t ComdataRead=0; //com串口数据已读取 uint8_t ComdataReady=0; //com串口数据接收完成 uint8_t ComOrdertype=0; //串口接收到的命令类型 uint8_t Comreturn; //软件判断串口返回给软件的数据,并回复给MCU确认上一返回数据是否正确接收,1 true ;0 fault /* - --函数名:Uart1串口初始化 --功 能: - */ void Uart1Init(void) { STR_UART_T sParam; // Set UART Pin DrvGPIO_InitFunction(E_FUNC_UART1); SYSCLK->CLKSEL1.UART_S = 0; /* UART_S UART 时钟源选择 00 = 时钟源为外部 4~24 MHz 晶振时钟 01 = 时钟源为 PLL 时钟 11 = 时钟源为内部 22.1184 MHz 振荡器时钟 */ // UART Setting sParam.u32BaudRate = 115200; sParam.u8cDataBits = DRVUART_DATABITS_8; sParam.u8cStopBits = DRVUART_STOPBITS_1; sParam.u8cParity = DRVUART_PARITY_NONE; //无检验 sParam.u8cRxTriggerLevel= DRVUART_FIFO_1BYTES; // Select UART Clock Source From 12Mhz //DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC,0); E_SYS_UART_CLKSRC DrvUART_Open(UART_PORT1,&sParam); // DrvUART_EnableInt(UART_PORT1,DRVUART_RDAINT & DRVUART_RDAINT,COM_INT_HANDLE); DrvUART_EnableInt(UART_PORT1, DRVUART_RDAINT, Uart1_ISR); //使能设置串口中断 // UART1->IER.RDA_IEN = 1; //接收中断使能 // UART1->IER.THRE_IEN = 0; //发送中断禁止 NVIC_SetPriority (UART1_IRQn, (1<<__NVIC_PRIO_BITS) - 4); //设置串口中断优先级(0~3,0最高,3最低) } /** --函数名:Uart1_ISR 串口1中断函数 --功 能:串口数据接收与发送 **/ void Uart1_ISR(uint32_t u32IntStatus) { uint8_t bInChar[1]; static uint8_t comsendcnt=0; //发送数据计数 static uint16_t comreccnt=0; //接收数据计数 if(u32IntStatus& DRVUART_RDAINT) //接收中断 { while(UART1->ISR.RDA_IF==1) { if(ComdataRead==1) { ComdataRead=0; comreccnt=0; } DrvUART_Read(UART_PORT1,bInChar,1); if(comreccnt<128) ComInBuf[comreccnt]= bInChar[0]; //将接收到的数据复制到缓存区 comreccnt++; if(comreccnt>=128) comreccnt=128; ResetTMR0Start(); //复位串口接收超时定时器0 } } if(u32IntStatus & DRVUART_THREINT) //发送中断 //DrvUART.H修改DRVUART_THREINT定义为BIT9 { if(UART1->ISR.THRE_IF) { /* THRE_INT 发送保持寄存器空中断标志 (Read Only). 如果 THRE_IEN 和 THRE_IF 都被置1,该位置 1。 1 = THRE中断产生 0 = 无 THRE中断产生 */ if(comsendcntDATA =ComOutBuf[comsendcnt]; //test comsendcnt++; } else //数据发送完毕 { if(UART1->FSR.TE_FLAG) {/* TE_FLAG 发送空标志位 (Read Only) 当 TX FIFO (UA_THR) 为空,而且最后一个字节的 STOP 位已发送,该位由硬件置位。 当 TX FIFO 不为空或最后一个字节传输未完成,该位自动清除。 */ comsendcnt=0; //重置发送计数 UART1->IER.THRE_IEN = 0; //关闭中断使能,需要发送数据时开启 // UART1->DATA =0; } } } } } /* //Uart1发送数据 // */ void SendCOMdata(uint8_t *buf,uint8_t datanum) { uint8_t i; for(i=0;iIER.THRE_IEN = 1; //开启中断使能,需要发送数据时开启 } |
|
相关推荐
1个回答
|
|
下面是一个简单的NUC120串口通信发送数据的示例代码:
```c #include "NUC100Series.h" #include "stdio.h" #define PLLCON_SETTING CLK_PLLCON_50MHz_HXT #define PLL_CLOCK 50000000 #define UART0_IRQn UART0_IRQn #define UART0_BAUD_RATE 115200 uint8_t ComInBuf[128]; uint8_t ComOutBuf[128]; uint8_t SendDataNum; uint8_t ComdataRead=0; uint8_t ComdataReady=0; uint8_t ComOrdertype=0; uint8_t ComOrderData[9]; uint8_t ComOrderDataBuf[9]; uint8_t Comreturn; void SYS_Init(void) { /* Enable HIRC clock (Internal RC 22.1184MHz) */ CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk); /* Waiting for HIRC clock ready */ CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk); /* Enable external XTAL 12 MHz */ CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk); /* Waiting for external XTAL clock ready */ CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk); /* Switch HCLK clock source to HXT */ CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HXT, CLK_CLKDIV_HCLK(1)); /* Set PCLK0/PCLK1 to HCLK/2 */ CLK->PCLKDIV = CLK_PCLKDIV_APB0DIV_DIV2 | CLK_PCLKDIV_APB1DIV_DIV2; /* Enable UART0 module clock */ CLK_EnableModuleClock(UART0_MODULE); /* Select UART0 module clock source */ CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0SEL_HXT, CLK_CLKDIV_UART(1)); /* Enable PDMA module clock */ CLK_EnableModuleClock(PDMA_MODULE); /* Enable UART0 NVIC */ NVIC_EnableIRQ(UART0_IRQn); } void UART0_Init(void) { /* Set PB multi-function pins for UART0 RXD and TXD */ SYS->GPB_MFPH &= ~(SYS_GPB_MFPH_PB14MFP_Msk | SYS_GPB_MFPH_PB15MFP_Msk); SYS->GPB_MFPH |= (SYS_GPB_MFPH_PB14MFP_UART0_RXD | SYS_GPB_MFPH_PB15MFP_UART0_TXD); /* Reset UART0 module */ SYS_ResetModule(UART0_RST); /* Configure UART0 and set UART0 baud rate */ UART_Open(UART0, UART0_BAUD_RATE); /* Enable UART0 receive interrupt */ UART_EnableInt(UART0, UART_IER_RDA_IEN_Msk); } void UART0_IRQHandler(void) { uint8_t data; uint32_t u32IntSts = UART0->ISR; if(u32IntSts & UART_ISR_RDA_IS_Msk) { /* Get all the input characters */ while(!UART_GET_RX_EMPTY(UART0)) { /* Get the character from UART Buffer */ data = UART_READ(UART0); /* Store the character to buffer */ ComInBuf[ComdataRead++] = data; /* Check if the buffer is full */ if(ComdataRead >= sizeof(ComInBuf)) { /* Buffer full, reset the index and indicate buffer ready */ ComdataRead = 0; ComdataReady = 1; } } } } void UART0_Send(uint8_t *pu8TxBuf, uint32_t u32WriteLen) { uint32_t i; for(i = 0; i < u32WriteLen; i++) { /* Wait if TX-FIFO is full */ while(UART_GET_TX_FULL(UART0)); /* Send data */ UART_WRITE(UART0, pu8TxBuf[i]); } } int main() { /* Init System, IP clock and multi-function I/O */ SYS_Init(); /* Init UART0 for printf */ UART0_Init(); while(1) { if(ComdataReady == 1) { /* Handle received data */ //... ComdataReady = 0; } if(SendDataNum > 0) { /* Send data */ UART0_Send(ComOutBuf, SendDataNum); /* Clear SendDataNum after sending */ SendDataNum = 0; } } } ``` 在该示例代码中,我们使用UART0来进行串口通信,通过UART0_Send函数向串口发送数据,其中ComOutBuf保存了需要发送的数据,SendDataNum保存了实际需要发送的数据个数。在main函数中轮询数据接收和数据发送状态,如果ComdataReady标志位为1,说明有新的数据接收完成,可以开始处理接收到的数据;如果SendDataNum大于0,说明需要发送数据,可以调用UART0_Send函数发送数据。在发送数据时,需要检查TX-FIFO是否已满,如果已满则等待一段时间后再发送数据。同时,如果需要在接收数据时进行一些特殊的处理,比如解析数据报文、执行命令等操作,可以在UART0_IRQHandler函数中添加相关代码。 |
|
|
|
只有小组成员才能发言,加入小组>>
705 浏览 0 评论
1114 浏览 1 评论
2491 浏览 5 评论
2826 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2671 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
661浏览 9评论
669浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
789浏览 6评论
634浏览 5评论
679浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 16:40 , Processed in 1.292754 second(s), Total 79, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号