打印

匠人求助 串口多字节发送 需要复位才显示?

[复制链接]
1704|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
16777216|  楼主 | 2013-6-11 20:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 16777216 于 2013-6-11 20:46 编辑

我在做串口多字节发送的时候,pc给单片机发送好后,单片机不显示,复位之后才显示,一般这是哪里出问题了

问题更新 现在使用匠人的串口猎人的高级发码ok 但是用普通方式 或者是别的软件串口助手就需要重启单片机才能正确显示上次发送的数据?

这是源代码
main.c

#include "uart.h"
#include "lcd1602.h"
#include "stc.h"
//extern unsigned char  receive;
unsigned char hello[]={"ello,boy\n"};
void main()
{
        Lcdstart();
        UartInit();
        Uart_send_char('h');
        Uart_send_str(hello);
        while(1)
        {
                if(uartflag)
                {        ES=0;
                        LCDclear();
                        LCD_write_num(2,2,receive);
                        ES=1;
                }

                uartflag=0;        
        }        
}


uart.c

#include "uart.h"
#include "stc.h"
//#include "lcd1602.h"
unsigned long int  receive;
bit uartflag=0;

unsigned char recdata[6];
unsigned char cnt=0;

void Uartnit(void);
void Uart_send_char(unsigned char ch);
void Uart_send_str(unsigned char  *str);




void interrupt_uart() interrupt 4                        //中断接收 receive
{
        if(TI)
        {
                TI = 0;
                REN = 1;
        }




        if(RI)
        {
                RI = 0;
               
                recdata[cnt]=SBUF;
        cnt++;
        if(recdata[0] == 0xaa)//0xaa为起始字节               
        {
                if(cnt>=6)
                {
                        //这里处理你的数据,以更新显示。
                                                 receive=recdata[1]+recdata[2]*10+recdata[3]*100+recdata[4]*1000+recdata[5]*10000;
                                                 uartflag=1;
                                                 cnt=0;
                                                      
                }        
        }else
        {
                cnt=0;//没有接收到字头,设置下一个可能为字头,
                                uartflag=0;
        }
                //receive= SBUF;
                //uartflag=1;
        }
}












/***********************************************************************/
/***************************通用函数***********************************/
void Uartinit(void)                //9600bps@11.0592MHz
{
        PCON &= 0x7F;                //波特率不倍速
        SCON = 0x50;                //8位数据,可变波特率
        AUXR &= 0xFB;                //独立波特率发生器时钟为Fosc/12,即12T
        BRT = 0xFD;                //设定独立波特率发生器重装值
        AUXR |= 0x01;                //串口1选择独立波特率发生器为波特率发生器
        AUXR |= 0x10;                //启动独立波特率发生器
        EA=1;
        ES=1;
}

void Uart_send_char(unsigned char ch)
{
         ES = 0;
         TI = 0;
         SBUF = ch;
         while(!TI);
         TI = 0;
         ES = 1;
}

void Uart_send_str(unsigned char  *str)
{
        while(*str != 0)
        {
                Uart_send_char(*str);
                str++;               
        }
}
































相关帖子

沙发
dqyubsh| | 2013-6-11 21:44 | 只看该作者
直观感觉,首先要把receive=那行从中断里拿出来,移到主程序里处理。或者把这行去掉,看看运行情况。至少不要在中断里做乘法转换。

还有,串行程序写这么简单,很可能会遭遇各种各样的问题,或者说,在工业上很难使用。建议参考MODBUS协议的分帧方法,看一下国外的开源代码。

使用特权

评论回复
板凳
pangencao| | 2013-6-12 14:54 | 只看该作者
高级发码与普通方式分别怎么操作的?

使用特权

评论回复
地板
16777216|  楼主 | 2013-6-12 16:14 | 只看该作者
pangencao 发表于 2013-6-12 14:54
高级发码与普通方式分别怎么操作的?

高级发码就是 第一组 aa  第二组 01 第三组 02 第四组01 第五组02 第六组01  第七组校验和07
普通发码就是一个个发的

估计是软件bug把 我俩单片机双机通信已经ok了

使用特权

评论回复
5
16777216|  楼主 | 2013-6-13 15:33 | 只看该作者
dqyubsh 发表于 2013-6-11 21:44
直观感觉,首先要把receive=那行从中断里拿出来,移到主程序里处理。或者把这行去掉,看看运行情况。至少不 ...

能提供下具体的思路么  或者一些伪代码

使用特权

评论回复
6
dqyubsh| | 2013-6-13 20:56 | 只看该作者
16777216 发表于 2013-6-13 15:33
能提供下具体的思路么  或者一些伪代码

http://www.freemodbus.org/

使用特权

评论回复
7
ningling_21| | 2013-6-13 21:30 | 只看该作者
dqyubsh 发表于 2013-6-13 20:56
http://www.freemodbus.org/

网页打不开....

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

399

帖子

1

粉丝