共2条
1/1 1 跳转至页
问
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
晶振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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图四被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 |