专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
PIC16f1947 串口通讯异常
2019-03-25 18:50
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
PIC单片机
4021
2
1668
您们好,最近我在做一个项目遇到一个串口异常问题,我用电脑连接的时候,串口通讯时间间隔10ms都是没有问题,最多出现乱码,因为是用485,乱码比较正常,停止10ms发送切换50ms能返回正常的数据。但是我多个单片机通讯的时候,总会有单片机串口崩溃现象,其他操作正常,就是串口没有数据反馈。在串口中断做了帧错误和溢出错误的处理。串口初始化代码
void uart_init(UINT8 brg)
{
TX2STA &= ~(0x01 << 4); //异步串口
//SYNC = 0; //异步串口
if(BRG_9600 == brg)
{
TX2STA &= ~(0x01 << 2); //低速波特率
//BRGH = 0; //低速波特率
BAUD2CON &= ~(0x01 << 3); //使用8位波特率发生器
//BRG16 = 0; //使用8位波特率发生器
SP2BRGL = 51;//9600波特率
}
else if(BRG_115200 == brg)
{
TX2STA |= (0x01 << 2); //高速波特率
//BRGH = 1; //高速波特率
BAUD2CON |= (0x01 << 3); //使用16位波特率发生器
//BRG16 = 1; //使用16位波特率发生器
SP2BRGL = 68;//115200波特率
SP2BRGH = 0;
}
else
{
TX2STA &= ~(0x01 << 2); //低速波特率
BAUD2CON &= ~(0x01 << 3); //使用8位波特率发生器
SP2BRGL = 51;//9600波特率
}
TRISG1 = 0; //IO配置 TX2
TRISG2 = 1; //IO配置 RX2
ANSG2 = 0; //必配
RC2STA |= (0x01 << 7); //使能串口
//SPEN = 1; //使能串口
TX2STA &= ~(0x01 << 6); //发送8位数据位
//TX9 = 0; //发送8位数据位
//CKTXP = 0; //发送数据极性 不翻转
RC2STA &= ~(0x01 << 6); //接收8位数据位
//RX9 = 0; //接收8位数据位
RC2STA |= (0x01 << 4); //使能接收
//CREN = 1; //使能接收
//RC2IF = 0;
RC2IE = 1; //接收使能
//PIE4 |= (0x01 << 5);
//INTCON |= (0x03 << 6);
RC2STAbits.CREN=1;//激活接收
PEIE = 1; //外设中断使能
GIE = 1; //总中断使能
//RC2STA &= ~(0x01 << 4); //使能接收
//RC2STA &= ~(0x01 << 7); //使能串口
//RC2STA |= (0x01 << 4); //使能接收
//RC2STA |= (0x01 << 7); //使能串口
}
复制代码
串口中断:
if (RC2IE && RC2IF)
{
// backlight_Dim(3);
// RC2IF = 0;
if(RC2STAbits.FERR)//监测是否有帧错误
{
err=RC2REG;
return;
}
if(RC2STAbits.OERR)
{
RC2STAbits.CREN=0;
RC2STAbits.CREN=1; //接收模块被复位重置,OERR清零
return;
}
//err = RC2STA & 0x04;
//err = FERR;
//RC2IF = 0;
ch = RC2REG;
if(RC2IF)
{
RC2IF = 0;
}
if(Ccnt > 25)
{
Ccnt = 0;
return;
}
if(ch == SOI0)
{
Ccnt = 0;
SOI_Flag = 1;
return;
}
if(SOI_Flag == 1) //检测是否是包头
{
SOI_Flag = 0;
if(ch == SOI1)
{
Recstatu = 1;
Ccnt = 0;
PackerFlag = 0;
return;
}
else
{
if(Recstatu == 1) //是否处于接收数据包状态
{
RxBuf[Ccnt++] = SOI0;
}
}
}
if(ch == EOI0)
{
EOI_Flag = 1;
return;
}
if(EOI_Flag == 1) //检测是否是包头
{
EOI_Flag = 0;
if(ch == EOI1) //检测是否是包尾
{
Recstatu = 0;
PackerFlag = 1; //用于告知系统已经接收到一个完整的数据包
GIE = 0;
return ;
}
else
{
if(Recstatu == 1) //是否处于接收数据包状态
{
RxBuf[Ccnt++] = EOI0;
}
}
}
if(Ccnt > 25)
{
Ccnt = 0;
return;
}
if(Recstatu == 1) //是否处于接收数据包状态
{
RxBuf[Ccnt++] = ch;
}
}
复制代码
此帖出自
小平头技术问答
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
751191958
2019-03-26 11:22
没用过,不知道
加载中...
查看其它2个回答
一周热门
更多
>
相关问题
相关文章
一种用PIC单片机主时钟驱动的老式挂钟
0个评论
单片机程序必知的几个寄存器
0个评论
单片机 矩阵式按键
0个评论
51单片机上移植C语言的printf()
0个评论
STC89C52MCU--软件实现系统复位
0个评论
单片机C语言程序该这样写!不是教科书上教的那样!转[]
0个评论
单片机并行I/O口(P0)硬件结构
0个评论
壹:单片机的内部资源
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
一周热门 更多>