打印
[学习资料]

串口通讯与串口调试实例

[复制链接]
1988|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qcliu|  楼主 | 2021-7-6 13:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
串口通信实例与详解


/********************************************************/
/*Author: Chunxu Shen; All Rights Reserved!
/*Tsinghua University
/*2016-11-14
********************************************************/
#include <pic.h>
__CONFIG(0x3ffa);

#define BAUD ???UL      
#define FOSC ???UL //根据实际情况,自己设定
#define DIVIDER ((int)(FOSC/(16UL * BAUD) -1))

unsigned int  send1[2] = {0x4f,0x4b}; //'O'=ASCII 0x4f;'K'=ASCII 0x4b; “OK”
unsigned int  send2[5] = {0x45,0x52,0x52,0x4f,0x52}; //'E'=ASCII 0x45;'R'=ASCII 0x52 “ERROR”
unsigned char rece;  //全局变量
unsigned int cnt;    //计数器

void main(void)
{
        //初始化端口程序
        TRISC7 = 1; //RX端口设为输入有效
        TRISC6 = 0; //TX端口设为输出有效
        //初始化串口设置
        SPBRG = DIVIDER;  //波特率设置
        TXSTA = 0x04;  //异步通讯-禁止发送数据-高速模式
        RCSTA = 0xA0;  //串口使能-接收单字符-禁止连续接受
        //中断设计
        RCIE = 1;  //允许接收信号触发中断
        GIE = 1;   //打开中断总开关
        PEIE = 1;  //允许外围设备触发中断
        //无限循环,等待PC机触发中断
        while(1)
        {
                ......
        }
}

//接收上位机送发的信号
void interrupt usart(void)
{
        if( RCIE )
        //RCIE:开放串行中断请求  RCIF:接收中断允许(接收区满or单字符)
        {
                ......
        }
}


使用特权

评论回复
沙发
qcliu|  楼主 | 2021-7-6 13:34 | 只看该作者
心得感悟
1.“查询”和“中断”哪种方式好?
这个问题就很奇怪了;其实没有绝对的好与不好。就个人而言,我更偏向于中断,思路比较清晰。无论哪种方式,记住核心就好。中断:采用的是通信外围设备触发(也就是PC机发送信号);而查询方式:采用的是接收移位寄存器溢出标志位以及发送移位寄存器清空的标志位。
2.为什么在main函数中设置字符数组mplab一直报错?
这个问题同学问我之后我一直没有答上来,因为我感觉这本身是没有错的。可能是配置的问题。为什么我没有碰到?因为我习惯把字符数组放到程序的预定义处。我也很推崇这种方式,这会大大增强程序的可读性。
3.通信流程该如何设定?
单片机通信模块都很相似:端口方向配置(那个是发送数据?哪个是接收数据?);串口状态配置(打开串口?连续发送?同步/异步?);中断配置(打开接收中断触发事件、开启总中断、开启外围中断触发);最后一个是进行数据处理。
4.TXSTA=0x24;会怎么样?
TXSTA=0010 0100B;异步-高速-允许发送模式
就个人而言,不建议这样写。因为接收信号触发中断,如果此时发送还是允许的,容易陷入一直都发送的死区。所以,我们可以试着这样做:“激发信号”触发 中断 ->允许数据发送->发送数据->关闭数据发送。


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

3308

帖子

4

粉丝