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 串口通信中 串口调试助手是截图 如下 还有就是单字节发送的时候先发送0X55然后 换成发送0X33 助手显示换数据发送以后 仍然会接受一段时间0X55才会变成0X33这个又是什么原因 求大神告知卡好久了这2个问题{:cry:} WINDOWS反应很慢啊。 TBG1 发表于 2016-1-5 12:33
WINDOWS反应很慢啊。
没办法公司只有这个系统{:cry:} if(j>2) 应改为 if(j>=2)吧,要不然接收数据保存数组会溢出吧,另换一个好用的串口调试助手 tdh03z 发表于 2016-1-5 21:26
if(j>2) 应改为 if(j>=2)吧,要不然接收数据保存数组会溢出吧,另换一个好用的串口调试助手 ...
谢谢我试试 tdh03z 发表于 2016-1-5 21:26
if(j>2) 应改为 if(j>=2)吧,要不然接收数据保存数组会溢出吧,另换一个好用的串口调试助手 ...
不行 结果还是一样的 发送也应该放在中断里....RAM放一段缓存,要发的数据全放里面...中断里一个一个往外送...
中断里PIC发数据时,
TXSTA1bits.TXEN=1;//主程序里这条就是直接跳到中断里发送字节了....
好好的程序非要加while弄出阻塞,何必呢... 说实话,需要加强下C语言的练习
仔细看了下,j 是全局变量,你在中断和主循环中都进行了操作,很容易出现意想不到的后果,你发送2个字节看看,应该可以收到2个字节,但连续发送多个字节,估计不对 tdh03z 发表于 2016-1-6 19:58
说实话,需要加强下C语言的练习
仔细看了下,j 是全局变量,你在中断和主循环中都进行了操作,很容易出现意 ...
嗯我也考虑到了这一点但是如果把主函数的J 改成其他变量 根本无法通信 这点想不明白 这个程序 只能通信编译以后的第一次 第二次第三次发送数据 就不行 tdh03z 发表于 2016-1-6 19:58
说实话,需要加强下C语言的练习
仔细看了下,j 是全局变量,你在中断和主循环中都进行了操作,很容易出现意 ...
刚试了一下虽然还有些数据丢包 但是 大部分数据 已经能通信成功 而已可以持续通信了 谢谢各位大神指点 通信成功了 {:lol:}
页:
[1]