ls13aicwz 发表于 2016-1-5 12:26:49

PIC18F66J90串口通信的问题,求大神帮忙看下

下面是小弟写的程序:
#include "Allinclude.h"
/**********************************宏定义*************************************/
#pragma config OSC = INTOSC
#pragma config WDTEN = OFF
#define uchar unsigned char
#define uint unsigned int
//中断声明
void PIC18F_High_isr (void);
void PIC18F_Low_isr (void);
#pragma code high_vector_section=0x8      
void high_vector (void)
      {
         _asm goto PIC18F_High_isr _endasm
      }

#pragma code low_vector_section=0x18

void low_vector (void)
      {
         _asm goto PIC18F_Low_isr _endasm
      }

#pragma code
//变量
uchar j;
uchar sendflag=0;
unsigned char LCDBuffer;
//系统时钟
void InitClok()
{
OSCCON=0x70;
}
//串口配置
void InitUart()
{
            TRISCbits.TRISC7=1;
            TRISCbits.TRISC6=1;                 // Set output for TXD
            BAUDCON1bits.BRG16=0;       //8位波特率发生器
                    TXSTA1bits.TX9=0;         //选择8位发送
                    TXSTA1bits.TXEN=1;          //发送使能
                    TXSTA1bits.SYNC=0;          //异步模式
            TXSTA1bits.BRGH=1;          //高速模式
            RCSTA1bits.SPEN=1;          //使能串口
            RCSTA1bits.RX9=0;         //选择8位接收
            RCSTA1bits.CREN=1;          //接受数据允许
            SPBRG=51;               //波特率9600,8MHZ,0,1
            
}
//中断初始化
void Interrupt_Init()
{
PIE1bits.RCIE=1;    //允许USART接收中断
PIR1bits.RCIF=0;    //清USART接收中断标志
RCONbits.IPEN=0;    //低优先级中断
INTCON|= 0xC0;   //CPU开中断并允许外设中断
}
//发送数据
void putch(unsigned char byte)        //发送一个字节的数据
{
        TXREG = byte;
        while(TXSTA1bits.TRMT==0)
        {
        Delay1KTCYx(10);
        }
        return;   
}
//主函数
void main(void)
{
InitClok();
InitUart();
Interrupt_Init();
while(1)
{
if(sendflag==1)
{
sendflag=0;
for(j=0;j<2;++j)
{
putch(LCDBuffer);
}
}
}
}
/******************************---高优先级中断服务程序---*************************/

#pragma interrupt PIC18F_High_isr

void PIC18F_High_isr (void)
      {
    if(PIR1bits.RCIF&&PIE1bits.RC1IE)
    {

       LCDBuffer=RCREG;//保存每一次接收到的数?
   
             ++j;
                   if(j>2)
                           {
                       
      sendflag=1;
                j=0;
                           }
                       
    }

}
/******************************---低优先级中断服务程序---**************************/

#pragma interruptlow PIC18F_Low_isr
void PIC18F_Low_isr (void)
      {
                
         }
芯片用的是PIC18F66J90   串口通信中 串口调试助手是截图 如下

ls13aicwz 发表于 2016-1-5 12:29:18

还有就是单字节发送的时候先发送0X55然后 换成发送0X33   助手显示换数据发送以后 仍然会接受一段时间0X55才会变成0X33这个又是什么原因 求大神告知卡好久了这2个问题{:cry:}

TBG1 发表于 2016-1-5 12:33:08

WINDOWS反应很慢啊。

ls13aicwz 发表于 2016-1-5 12:39:44

TBG1 发表于 2016-1-5 12:33
WINDOWS反应很慢啊。

没办法公司只有这个系统{:cry:}

tdh03z 发表于 2016-1-5 21:26:55

if(j>2) 应改为 if(j>=2)吧,要不然接收数据保存数组会溢出吧,另换一个好用的串口调试助手

ls13aicwz 发表于 2016-1-6 08:13:48

tdh03z 发表于 2016-1-5 21:26
if(j>2) 应改为 if(j>=2)吧,要不然接收数据保存数组会溢出吧,另换一个好用的串口调试助手 ...

谢谢我试试

ls13aicwz 发表于 2016-1-6 09:06:45

tdh03z 发表于 2016-1-5 21:26
if(j>2) 应改为 if(j>=2)吧,要不然接收数据保存数组会溢出吧,另换一个好用的串口调试助手 ...

不行   结果还是一样的

M1379 发表于 2016-1-6 10:11:19

发送也应该放在中断里....RAM放一段缓存,要发的数据全放里面...中断里一个一个往外送...

中断里PIC发数据时,

TXSTA1bits.TXEN=1;//主程序里这条就是直接跳到中断里发送字节了....

好好的程序非要加while弄出阻塞,何必呢...

tdh03z 发表于 2016-1-6 19:58:56

说实话,需要加强下C语言的练习
仔细看了下,j 是全局变量,你在中断和主循环中都进行了操作,很容易出现意想不到的后果,你发送2个字节看看,应该可以收到2个字节,但连续发送多个字节,估计不对

ls13aicwz 发表于 2016-1-7 08:55:46

tdh03z 发表于 2016-1-6 19:58
说实话,需要加强下C语言的练习
仔细看了下,j 是全局变量,你在中断和主循环中都进行了操作,很容易出现意 ...

嗯我也考虑到了这一点但是如果把主函数的J 改成其他变量 根本无法通信    这点想不明白   这个程序 只能通信编译以后的第一次   第二次第三次发送数据 就不行   

ls13aicwz 发表于 2016-1-7 09:04:43

tdh03z 发表于 2016-1-6 19:58
说实话,需要加强下C语言的练习
仔细看了下,j 是全局变量,你在中断和主循环中都进行了操作,很容易出现意 ...

刚试了一下虽然还有些数据丢包 但是 大部分数据 已经能通信成功   而已可以持续通信了

ls13aicwz 发表于 2016-1-7 09:05:22

谢谢各位大神指点    通信成功了 {:lol:}
页: [1]
查看完整版本: PIC18F66J90串口通信的问题,求大神帮忙看下