这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 串口通信的问题 !

共2条 1/1 1 跳转至

串口通信的问题 !

院士
2006-09-17 18:14:16     打赏
串口通信的问题 !



关键词: 串口     通信     问题    

院士
2006-12-22 22:43:00     打赏
2楼
PIC18F8490,串口通信,收只有一次正常,其他只能收到FF.为什么?
晶振11.0592,波特率9600,高速异步8位传输。BRG=71;串口的配置也是按照DATASHEET的。。通过WATCH,只调试收数据时,上位机发下来的数据发了多次后才能进入一次接收中断。简单说,就是我开串口调试助手,不停的发数据,下位机只接受到一次正确的数据,然后就是FF.只调试单片机发送数据时,程序死在中断里。。。移位发送寄存器一直处于满状态,大家知道,发送的中断标志是由硬件清的,结果就导致我发的数据虽然在TXREG缓冲区里有,但因为寄存器一直满,所以就一直发不出去。。。

检查硬件,那块电平转换芯片正负电压都正常,发送状态时,上位机的输入有波形,输出到PIC的也有。但是发送就是没有任何波形。


本人才疏学浅,实在搞不定,希望各位大侠施展一下身手,拔刀相助! 1: 全部改用查询做实试吧! 2: 个人见解发的数据虽然在TXREG缓冲区里有,但因为寄存器一直满,所以就一直发不出去
——不是很明白LZ的意思,既然是由数据应该是不停的发,为什么是发不出去?
1 可能是硬件控制寄存器没有设置好,详细看看DATASHEET说明
2 波特率不对,循环发送0x55或0xAA 示波器测量脉宽是否正确? 3: 多谢大家,不过还是没搞明白。。。。回楼上的,是这样的,PIC有两级的存储区。数据由软件放到TXREG缓冲器中,然后当收到停止符时,硬件把缓冲器数据放到移位发送寄存器中。然后才是真正的发出去。

(只调试发送的过程)硬件控制寄存器的确没设置好。改正后,我把发送和接收中断关了。在主程序里发数据给上位机。
    if(i==8)
    {
       i=0;
    }                
    TXREG1 = buff[i];
    i++;
上位机收到几十次数据后,就没了。我想应该是时序问题。。。
请教一下该在哪里延时或者怎么处理?能够让它每次的数据都能发送到上位机 4: 程序如下,拜托看看啊!!!void Ini_Uart()
{
// SET UART I/O         
        TRISC6 = 0;
        TRISC7 = 1;
// SET TXSTA         
        CSRC         = 0;        
        TX9                = 0;        // 8位数据格式
        TXEN         = 0;        // 发送允许no
        SYNC         = 0;        // 异步通信方式
        BRGH        = 0;        // 高速波特率设置
        TRMT        = 0;        
        TX9D        = 0;        

// SET RCSTA
        SPEN        = 1;        // UART允许
        RX9                = 0;        // 接收第9位清0
        SREN        = 0;        
        CREN        = 0;        // 接收允许        no
        FERR        = 0;
        OERR        = 0;
        RX9D        = 0;
        
// SET bautrate
        SPBRG         = 17;                // SET 9600bps
// SET UART INTERRUPT
        TXIE        = 0;        // UART 发送中断允许NO
        TXIF        = 0;        // UART 发送中断标志位清0
        RCIE        = 0;        // UART 接收中断允许NO
        RCIF        = 0;        // UART 接收中断标志位清0        
}
mian()
{
        INTCON=0x00;        
                      initial();
        Ini_Uart();
TXEN=1;        
    while(1)
    {                
                        if(TRMT==1)//如果移位发送寄存器空
                        {                                
                                if(i==8)
                                {
                                        i=0;
                                }                                
                                        TXREG1 = buff[i];
                                        i++;
                                                                                                
                        }
}
void initial()
{

        PIE1=0x00;
        PIE2=0x00;
        PIE3=0x00;
5: 这个程序在在线调试模式下,可以让上位机收到24组数据,接着就再也收不到了

直接烧进去,上电后,收到两个字节,不是我的数据。关电后,收到一串数据,也不是我的真实数据。 6: 个人见解关闭了串口中断,发送数据是需要用TF标志或者检查缓位移寄存器标志来判断是否完成的,
//检查位移寄存器
void putch(unsigned char byte)
{
  while(!TRMT1)continue;        
  TXREG1 = byte;
}
//检查中断标志,在初始化时需要置TX1IF为1
void putch(unsigned char byte)
{
  while(!TX1IF)continue;        
  TX1IF = 0;
  TXREG1 = byte;
}

//检查中断标志
void putch(unsigned char byte)
{          
  TX1IF = 0;
  TXREG1 = byte;
  while(!TX1IF)continue;
}

详细的可以参考器件的datasheet和编译器的使用说明

另外LZ应该养成一个好的习惯,包含的条件应该比较完善
    if(i==8)
    {
       i=0;
    }                
    i++;
那么如果i的入口条件>8呢?只有到溢出至下一次达到条件,如果改为
if(i>=8)就可以更快的达到条件,同时也可以有效避免访问超限的地址,这在写操作中尤为重要。


7: 楼上的兄弟发送中断标志位,DATASHEET里面说是由硬件来置为复位的啊。而且我用的是非中断的方式。只是想用最简单的程序做测试。可是。。。。5555555
还是不行…………………… 8: 好像是我复位电路有问题检查硬件ING^^^^^^^^^^^^^^^ 9: 求PIC单片机12位格雷码转换到相应二进制数的原程序代码那位大虾有,请告知我,qq :452853915,不胜感激!!1

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]