打印
[51单片机]

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

[复制链接]
5139|41
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
下面是串口单片机发送字节的程序,没啥问题
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  只是多了一个吧

使用特权

评论回复
5
一切会如旧|  楼主 | 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;                  //打开串口中断
}                  
   

使用特权

评论回复
6
mfktuu| | 2013-10-23 13:39 | 只看该作者
确定程序没问题了,看下串口调试助手设置

使用特权

评论回复
7
一切会如旧|  楼主 | 2013-10-23 13:44 | 只看该作者
ipman 发表于 2013-10-22 23:42
去掉主while,看看还有没有单独一个 00
void main (void)
{

没有

使用特权

评论回复
8
一切会如旧|  楼主 | 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.......这样循环下去

使用特权

评论回复
9
一切会如旧|  楼主 | 2013-10-23 14:02 | 只看该作者
mfktuu 发表于 2013-10-23 13:39
确定程序没问题了,看下串口调试助手设置


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

使用特权

评论回复
10
dirtwillfly| | 2013-10-23 14:03 | 只看该作者
程序没问题,应该是电路的问题。
瞬态时串口的电平为逻辑0,可以在单片机的TXD和RXD上各接1个1K的上拉电阻试试

使用特权

评论回复
11
ballack_linux| | 2013-10-23 14:05 | 只看该作者
这么奇怪   把Delay函数贴出来看看

使用特权

评论回复
12
一切会如旧|  楼主 | 2013-10-23 14:09 | 只看该作者
ballack_linux 发表于 2013-10-23 14:05
这么奇怪   把Delay函数贴出来看看

void delay(int t)
{
        while(t--);
}

使用特权

评论回复
13
一切会如旧|  楼主 | 2013-10-23 15:18 | 只看该作者
dirtwillfly 发表于 2013-10-23 14:03
程序没问题,应该是电路的问题。
瞬态时串口的电平为逻辑0,可以在单片机的TXD和RXD上各接1个1K的上拉电阻 ...

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


使用特权

评论回复
14
一切会如旧|  楼主 | 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.......这样循环下去

使用特权

评论回复
15
笑着去斗斗| | 2013-10-23 15:25 | 只看该作者
一切会如旧 发表于 2013-10-23 13:35
void InitUART  (void)
{
    SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  

TL1不用装初值吗?

使用特权

评论回复
16
一切会如旧|  楼主 | 2013-10-23 15:55 | 只看该作者
笑着去斗斗 发表于 2013-10-23 15:25
TL1不用装初值吗?

定时器工作在方式2模式

使用特权

评论回复
17
俊来| | 2013-10-23 16:13 | 只看该作者
我感觉这应该是不同步的问题  因为单片机刚一上电  程序立马就开始循环  而程序的执行速度是特别快的 当我们打开串口的时候 谁知道程序循环到什么位置了 所以在串口调试助手的显示区00 01 02任意显示了 不一定是从0开始的

使用特权

评论回复
18
俊来| | 2013-10-23 16:22 | 只看该作者
你可以先把程序下载到单片机  然后把单片机断电 打开串口  然后再给单片机上电 就可以看到是正确的了  如果还不正确,可以再讨论

使用特权

评论回复
19
一切会如旧|  楼主 | 2013-10-23 16:35 | 只看该作者
俊来 发表于 2013-10-23 16:22
你可以先把程序下载到单片机  然后把单片机断电 打开串口  然后再给单片机上电 就可以看到是正确的了  如果 ...

嗯,已经排除了这种情况,我就是先把程序下到单片机后,先把单片机断电,然后打开串口,再给单片机上电才出现这种现象的。不然刚开始出现的数据会是从“00 01 02”三个中某个开始显示,而不是现在出现的总是先“00”才“00 01 02”循环。

使用特权

评论回复
20
wangxm86| | 2013-10-23 17:15 | 只看该作者
LZ,你将串口初始化里的SCON寄存器SCON=0x50改成这样试试,
SM0=0;
SM1=1;
REN=1;

使用特权

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

本版积分规则

17

主题

158

帖子

0

粉丝