[51单片机] 单片机与PC串口通信,遇到个小现象,怎么回事?

[复制链接]
 楼主| 一切会如旧 发表于 2013-10-22 20:16 | 显示全部楼层 |阅读模式
下面是串口单片机发送字节的程序,没啥问题
void SendByte(unsigned char dat)
{
SBUF = dat;
while(!TI);
      TI = 0;
}


主程序是这样的:

void main (void)
{
    unsigned char temp;
    InitUART();
    while(1)
    {
        temp=0x00;
        SendByte(temp);
       delay(10000);

       temp=0x01;
       SendByte(temp);
       delay(10000);

       temp=0x02;
       SendByte(temp);
       delay(10000);
    }
}


按理来讲,PC上接收到的数据应该是00,01,02循环,但我得到下面的结果:


为什么刚上电后会收到两个“00”的数据?(后面的数据都是正常的,就刚上电后才会出现这样的情况)
求教!!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
dirtwillfly 发表于 2013-10-22 22:19 | 显示全部楼层
你的InitUART();程序神怎么写的?
ipman 发表于 2013-10-22 23:42 | 显示全部楼层
去掉主while,看看还有没有单独一个 00
void main (void)
{
    unsigned char temp;
    InitUART();
}

ballack_linux 发表于 2013-10-23 09:26 | 显示全部楼层
这个是正常现象 , 你试试直接串口线,然后不连单片机,然后打开串口调试工具, 看是不是有一个00出来,
你那个不是多了两个00  只是多了一个吧
 楼主| 一切会如旧 发表于 2013-10-23 13:35 | 显示全部楼层
dirtwillfly 发表于 2013-10-22 22:19
你的InitUART();程序神怎么写的?

void InitUART  (void)
{
    SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
    TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
    TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  
    TR1   = 1;                  // TR1:  timer 1 打开                        
    EA    = 1;                  //打开总中断
    ES    = 1;                  //打开串口中断
}                  
   
mfktuu 发表于 2013-10-23 13:39 | 显示全部楼层
确定程序没问题了,看下串口调试助手设置
 楼主| 一切会如旧 发表于 2013-10-23 13:44 | 显示全部楼层
ipman 发表于 2013-10-22 23:42
去掉主while,看看还有没有单独一个 00
void main (void)
{

没有
 楼主| 一切会如旧 发表于 2013-10-23 13:58 | 显示全部楼层
ballack_linux 发表于 2013-10-23 09:26
这个是正常现象 , 你试试直接串口线,然后不连单片机,然后打开串口调试工具, 看是不是有一个00出来,
...

是只多了一个00,不连单片机打开串口调试工具后没反应。我试了试在发送第一个数据前加了一个延迟函数(延迟1s),结果是上电后前面多了“00 02”,然后才是“00 01 02”的循环。
而当我去掉所有的延迟函数后,结果却是正确的“00 01 02”的循环。
而如果只是在发送第一个数据前加一个延迟函数,现象是:显示00,停顿,显示01 02,停顿,显示00 01 02,停顿,显示00 01 02.......这样循环下去
 楼主| 一切会如旧 发表于 2013-10-23 14:02 | 显示全部楼层
mfktuu 发表于 2013-10-23 13:39
确定程序没问题了,看下串口调试助手设置


设置应该没问题吧,调另外一个程序时(单片机先向PC发送一个数据A,再由PC向单片机发送一个数据B,单片机接收到B后返回给PC),没出现什么问题

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
dirtwillfly 发表于 2013-10-23 14:03 | 显示全部楼层
程序没问题,应该是电路的问题。
瞬态时串口的电平为逻辑0,可以在单片机的TXD和RXD上各接1个1K的上拉电阻试试
ballack_linux 发表于 2013-10-23 14:05 | 显示全部楼层
这么奇怪   把Delay函数贴出来看看
 楼主| 一切会如旧 发表于 2013-10-23 14:09 | 显示全部楼层
ballack_linux 发表于 2013-10-23 14:05
这么奇怪   把Delay函数贴出来看看

void delay(int t)
{
        while(t--);
}
 楼主| 一切会如旧 发表于 2013-10-23 15:18 | 显示全部楼层
dirtwillfly 发表于 2013-10-23 14:03
程序没问题,应该是电路的问题。
瞬态时串口的电平为逻辑0,可以在单片机的TXD和RXD上各接1个1K的上拉电阻 ...

但是我把发送的数据换成“0xaa  0xbb  0xcc”循环发送后,多出来的总是发送的第一个数据:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 一切会如旧 发表于 2013-10-23 15:20 | 显示全部楼层
dirtwillfly 发表于 2013-10-23 14:03
程序没问题,应该是电路的问题。
瞬态时串口的电平为逻辑0,可以在单片机的TXD和RXD上各接1个1K的上拉电阻 ...

而当我去掉所有的延迟函数后,结果却是正确的“00 01 02”的循环。
而如果只是在发送第一个数据前加一个延迟函数,现象是:显示00,停顿,显示01 02,停顿,显示00 01 02,停顿,显示00 01 02.......这样循环下去
笑着去斗斗 发表于 2013-10-23 15:25 来自手机 | 显示全部楼层
一切会如旧 发表于 2013-10-23 13:35
void InitUART  (void)
{
    SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  

TL1不用装初值吗?
 楼主| 一切会如旧 发表于 2013-10-23 15:55 | 显示全部楼层
笑着去斗斗 发表于 2013-10-23 15:25
TL1不用装初值吗?

定时器工作在方式2模式
俊来 发表于 2013-10-23 16:13 | 显示全部楼层
我感觉这应该是不同步的问题  因为单片机刚一上电  程序立马就开始循环  而程序的执行速度是特别快的 当我们打开串口的时候 谁知道程序循环到什么位置了 所以在串口调试助手的显示区00 01 02任意显示了 不一定是从0开始的
俊来 发表于 2013-10-23 16:22 | 显示全部楼层
你可以先把程序下载到单片机  然后把单片机断电 打开串口  然后再给单片机上电 就可以看到是正确的了  如果还不正确,可以再讨论
 楼主| 一切会如旧 发表于 2013-10-23 16:35 | 显示全部楼层
俊来 发表于 2013-10-23 16:22
你可以先把程序下载到单片机  然后把单片机断电 打开串口  然后再给单片机上电 就可以看到是正确的了  如果 ...

嗯,已经排除了这种情况,我就是先把程序下到单片机后,先把单片机断电,然后打开串口,再给单片机上电才出现这种现象的。不然刚开始出现的数据会是从“00 01 02”三个中某个开始显示,而不是现在出现的总是先“00”才“00 01 02”循环。
wangxm86 发表于 2013-10-23 17:15 | 显示全部楼层
LZ,你将串口初始化里的SCON寄存器SCON=0x50改成这样试试,
SM0=0;
SM1=1;
REN=1;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

158

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部