[PIC®/AVR®/dsPIC®产品]

PIC18F67K22单片机串口问题

[复制链接]
1631|3
手机看帖
扫描二维码
随时随地手机跟帖
hj007|  楼主 | 2017-4-7 17:14 | 显示全部楼层 |阅读模式
使用串口发送数据时,当把串口配置函数和发送函数放到main函数的.c文件中,串口能正常发送字符串,但是把串口的配置函数和发送函数放到其他自定义.c文件中,串口只能发送字符串的头和尾(电脑上的串口助手只显示头和尾),不明白这是为什么,,真是活见鬼了,哪位大神指点一下。

这是我的源代码:

//串口初始化
void Usart1_Init()
{
        TRISC7 = 1;
        TRISC6 = 0;
       
        //TXSTAx:发送状态和控制寄存器
        TXSTA1bits.TX9        = 0;                //选择8位发送
        TXSTA1bits.TXEN        = 1;                //使能发送
        TXSTA1bits.SYNC = 0;                //异步模式
        TXSTA1bits.BRGH = 1;                //高速模式

       
        //RCSTAx:接收状态和控制寄存器
        RCSTA1bits.SPEN        = 1;                //使能串口
        RCSTA1bits.RX9  = 0;                //选择8位接收
        RCSTA1bits.CREN = 1;                //0=禁止接收器,1= 允许接收器
        RC1IE = 1;                                        //接收中断允许位
        INTCONbits.GIE  = 1;
        INTCONbits.PEIE = 1;
        RC1IF = 0;

        //BAUDCONx:波特率控制寄存器
        BAUDCON1bits.BRG16  = 1;                //16 位波特率发生器――SPBRGHx 和 SPBRGx
       
        SPBRG = 95;                                //波特率为19200pbs
}

//串口发送一个字节数据
void Usart1_Send_Byte(char dat)
{
    TXREG1 = dat;
    while(!TXSTA2bits.TRMT);      
}


//串口发送十六进制数组
void Usart1_Send_Array(char array[],char n)
{
        unsigned char i=0;
    for(i = 0; i < n; i ++)
    {
        Usart1_Send_Byte(array[i]);
        __delay_us(500);
    }
}

//串口发送一个字符串数据
void Usart1_Send_String(char *str)
{
    while(*str != '\0')
    {
                Usart1_Send_Byte(*str++);
        __delay_us(500);
    }
}


//********************************
注 :把这段代码放在main函数同一个.c文件中发送串时没问题的,但是放到自定义的.h.c文件中就只能发送头和尾,我调试时发现void Usart1_Send_Byte(char dat)函数随便放在哪里不影响,就是发送串的两个函数(void Usart1_Send_String(char *str)和void Usart1_Send_Array(char array[],char n))不行


求助!!!!

hj007|  楼主 | 2017-4-7 18:11 | 显示全部楼层
各位,首先想说一句:细节决定成败。就这个串口发送程序浪费了我一天的时间,刚刚仔细查看源程序,发现查询串口是否发送完毕的寄存器读错了(while(!TXSTA2bits.TRMT); )本来应该是TXSTA1bits.TRMT的,结果被我写成TXSTA2bits.TRMT,查询方式不对将导致发送多个字符丢数据的情况。
希望各位引以为戒!!!

使用特权

评论回复
yklstudent| | 2017-4-7 19:20 | 显示全部楼层
__delay_us(500);
你要这个延时干嘛

使用特权

评论回复
hj007|  楼主 | 2017-4-7 20:40 | 显示全部楼层
yklstudent 发表于 2017-4-7 19:20
__delay_us(500);
你要这个延时干嘛

这个也算是偶然的发送成功的误导吧,其实发送的时候查询TXSTA1bits.TRMT是完全不需要的,就是因为我查询错了,查询的是TXSTA2bits.TRMT,这个寄存器一直为0,而发送单个字节不需要等待,所以查不查询都无所谓,但是当发送字符串的的时候我查询的还是TXSTA2bits.TRMT,那么第一个字符发送没问题,而中间的字符还没有等待上一个字符发送完毕就继续写入TXREG1,这才导致中间的字符数据丢失,无意间加上一个延时函数竟然没有数据丢失的情况,我就认为需要加一个延时函数,但是当我把这几个函数放在单独的.c文件中又不行了,中间的数据丢失了。
这个延时函数在错误的情况下,继续诱导我继续犯错,导致我以为活见鬼了,把这几个函数放在main函数同一文件中就ok,放到其他.c文件中就不行。

使用特权

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

本版积分规则

9

主题

39

帖子

0

粉丝