打印
[学习资料]

异步串口通讯实例与细节

[复制链接]
7402|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qcliu|  楼主 | 2021-7-6 13:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.前言

PIC16F876a异步串口通信的定义以及寄存器控制,这里不再多谈,前面已经进行过详细的分析。这里注意集中在几个关键点上。

串口中断服务程序应该注意什么?

利用串口助手进行调试应该注意什么?

串口助手接收不到数据的几种可能因素?


使用特权

评论回复
沙发
qcliu|  楼主 | 2021-7-6 13:48 | 只看该作者
2.实例分析
PIC单片机与上位机握手程序如下:


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

#define BAUD 9600   
#define FOSC 9216000L
#define DIVIDER ((int)(FOSC/(16UL * BAUD) -1))

unsigned char Rece_flag ;  //初始化,串口接受标志

void main(void)
{
        //初始化端口程序
        TRISC7 = 1; //RX端口设为输入有效
        TRISC6 = 0; //TX端口设为输出有效

        //初始化串口设置
        SPBRG = DIVIDER;  //波特率设置
        TXSTA = 0x24;  //内部波特率-8bit-允许发送-异步通讯 空-低速模式-发送寄存器满空-无奇偶校验
        RCSTA = 0x90;  //串口使能-不接收单字符-允许禁止连续接收

        //中断设计
        GIE  = 1;   //打开中断总开关
        PEIE = 1;  //允许外围设备触发中断
        RCIE = 1;  //允许接收信号触发中断
        RCIF = 0;

        //等待PC机触发中断
        while(1)
        {
                if('E' == Rece_flag) //对应上位机“结束”按键
                        {//给PC机反馈信号“END”
                                TXREG = 'E';
                                while( TRMT == 0 )
                                        continue; //检验发送是否结束
                                TXREG = 'N';
                                while(TRMT==0)        
                                        continue;
                                TXREG = 'D';
                                while(TRMT==0)
                                        continue;
                        }
                        else if( 'S' == Rece_flag )
                        {
                                //给PC机反馈信号“OK”
                                TXREG = 'O';
                                while(TRMT==0)
                                        continue;               
                                TXREG = 'K';
                                while(TRMT==0)
                                        continue;                               
                        }
                        else //其他信号不响应
                        {        ;        }
        }
}

//接收上位机送发的信号
void interrupt usart(void)
{
        if( RCIF )
        {
                RCIF = 0;  //软件清零
                Rece_flag = RCREG;        
        }
}


使用特权

评论回复
板凳
qcliu|  楼主 | 2021-7-6 13:49 | 只看该作者
3.经验总结
1.编写中断服务程序时,一定要注意接收中断标志位这个事儿!RCIF这个标志位,硬件不会自动清空。因此,一旦我们编写中断服务程序时,先把RCIF清零!!!

2.利用串口助手进行调试的时候,关注端口号!!!(计算机->管理->设备管理器->端口)确定你选择的端口是与PIC单片机是相连的,否则即使协议很正确,端口号没对上,也白扯。

3.波特率很关键,看好高低速,把初值算对很重要。


使用特权

评论回复
地板
yangxiaor520| | 2021-7-6 17:54 | 只看该作者
PIC单片机现在很少用了吧

使用特权

评论回复
5
两只袜子| | 2021-7-8 16:22 | 只看该作者
pic单片机还有多少人在用

使用特权

评论回复
6
两只袜子| | 2021-7-8 16:22 | 只看该作者
pic

使用特权

评论回复
7
两只袜子| | 2021-7-8 16:22 | 只看该作者
pic

使用特权

评论回复
8
两只袜子| | 2021-7-8 16:22 | 只看该作者
pic

使用特权

评论回复
9
zhengshuai888| | 2021-7-10 09:26 | 只看该作者
经典通信接口

使用特权

评论回复
10
单片小菜| | 2021-7-14 15:24 | 只看该作者
波特率是关键,只要有错误,就很难精准了。

使用特权

评论回复
11
自己造声卡| | 2021-7-14 17:20 | 只看该作者
很多时候,成败都是在细节上的。

使用特权

评论回复
12
木木guainv| | 2021-8-6 18:31 | 只看该作者
都是比较容易出问题的环节

使用特权

评论回复
13
xiaoqizi| | 2021-8-6 18:35 | 只看该作者
之前分析的帖子能给一个网址吗

使用特权

评论回复
14
wakayi| | 2021-8-6 18:40 | 只看该作者
时钟同步是关键啊

使用特权

评论回复
15
qcliu|  楼主 | 2021-9-4 18:16 | 只看该作者
是的 这个同步确实很关键

使用特权

评论回复
16
qcliu|  楼主 | 2021-9-4 18:17 | 只看该作者
yangxiaor520 发表于 2021-7-6 17:54
PIC单片机现在很少用了吧

这个单片机用的还是很多的啊

使用特权

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

本版积分规则

62

主题

3315

帖子

4

粉丝