本帖最后由 hu9jj 于 2020-12-3 15:50 编辑
PIC18F57Q43共有5个USART,开始我准备测试虚拟串行端口,但反复尝试均无结果,只好改用USB转TTL模块来连通单片机与电脑。本次测试使用UART1串口,通过MMC配置RC2引脚为TX,RC3引脚为RX。
生成代码之后,在UART1.h文件里面有轮询法的例子,可以直接复制到主循环中稍加修改进行测试:
下面是我的测试代码:
if(UART1_is_rx_ready())
{
Rx_Buff[0] = UART1_Read(); //接收串口数据
LCD_write_ASCII(recond++*6,5,1,Rx_Buff[0]);
if(recond > 30)
recond = 0;
if(UART1_is_tx_ready())
{
UART1_Write(Rx_Buff[0]); //将接收到的数据发送回电脑
}
}
经过测试,在串口调试助手中发出字符串,只要长度不超过7个字符,就能正确地接收,超过7个字符时,串口调试助手接收到的字符就可能不完整:
下面的测试时字符串不超过7个,接收到字符串都是完整的:
轮询法测试完成后,开始进行中断法接收和发送。在UART1.c文件中,找到UART1_RxDataHandler函数,在里面加上发送的代码,就完成了将接收的数据发送回电脑,代码如下:
<blockquote>void UART1_RxDataHandler(void){
void UART1_RxDataHandler(void){
// use this default receive interrupt handler code 使用这个默认的接收中断处理程序代码
/* uart1RxBuffer[uart1RxHead++] = U1RXB;
if(sizeof(uart1RxBuffer) <= uart1RxHead)
{
uart1RxHead = 0;
}
uart1RxCount++;
*/
Rx_Buff[recond++] = U1RXB;
if(UART1_is_tx_ready()){
UART1_Write(U1RXB);
}
if(recond > 31){
recond = 0;
}
}
使用中断法就可以完整的接收到发送的字符串:
那末如何获得完整的一次串口通讯数据呢?我根据需要定义了一个全局的32个下标的一维数组,在中断处理函数中取得了字符串之后,在主循环中进行处理,将接收到的数据显示在LCD屏幕上。下面是在主循环中相关的代码:
if(!UART1_is_rx_ready() & recond > 0){
Rx_Buff[recond] = 0; //置字符串结束标志
LCD_write_value(120,6,3,0,1,recond);
LCD_write_ASCII(0,6,1,Rx_Buff);
for(i=0; i<32; i++){
Rx_Buff[i] = 0;
}
recond = 0;
下面是测试过程的照片,红线标注的是接收到的内容:
串口通讯的测试至此结束。
|