打印
[51单片机]

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

[复制链接]
楼主: 一切会如旧
手机看帖
扫描二维码
随时随地手机跟帖
21
一切会如旧 发表于 2013-10-23 14:02
设置应该没问题吧,调另外一个程序时(单片机先向PC发送一个数据A,再由PC向单片机发送一个数据B,单片 ...

这个一时半会,看不出来,兄弟你慢慢来,别急,会有收获的。观察下电路,单片机串口也就是高低电平的输出,232芯片也就是个电平的转换,观察有没有变换。

使用特权

评论回复
22
ifft| | 2013-10-23 17:54 | 只看该作者
本帖最后由 ifft 于 2013-10-23 17:56 编辑

可能是硬件问题

使用特权

评论回复
23
一切会如旧|  楼主 | 2013-10-23 18:08 | 只看该作者
mfktuu 发表于 2013-10-23 17:38
这个一时半会,看不出来,兄弟你慢慢来,别急,会有收获的。观察下电路,单片机串口也就是高低电平的输出 ...

谢谢

使用特权

评论回复
24
一切会如旧|  楼主 | 2013-10-23 18:08 | 只看该作者
ifft 发表于 2013-10-23 17:54
可能是硬件问题

也许吧。。。

使用特权

评论回复
25
俊来| | 2013-10-23 19:48 | 只看该作者
一切会如旧 发表于 2013-10-23 16:35
嗯,已经排除了这种情况,我就是先把程序下到单片机后,先把单片机断电,然后打开串口,再给单片机上电才 ...

是这样吗 同样的程序 在我这里都运行的很好呀 没有出现像楼主说的情况  难道是硬件的问题

使用特权

评论回复
26
xiaoyigechaos| | 2013-10-23 22:03 | 只看该作者
貌似在插串口线的时候 或者 不通信的时候 会出现00   

使用特权

评论回复
27
ballack_linux| | 2013-10-24 00:39 | 只看该作者
一切会如旧 发表于 2013-10-23 15:55
定时器工作在方式2模式

定时器工作在方式二模式 是自动重装,但是不是刚上来就自动重装值的吧,是产生溢出中断后自动重装的,也就是说TL1刚开始是从00开始计数,到255之后才溢出,接着TH1才把值赋值给TL1

使用特权

评论回复
28
一切会如旧|  楼主 | 2013-10-24 12:23 | 只看该作者
俊来 发表于 2013-10-23 19:48
是这样吗 同样的程序 在我这里都运行的很好呀 没有出现像楼主说的情况  难道是硬件的问题  ...

也许吧,换了个串口线还是这样。。。

使用特权

评论回复
29
一切会如旧|  楼主 | 2013-10-24 12:44 | 只看该作者
ballack_linux 发表于 2013-10-24 00:39
定时器工作在方式二模式 是自动重装,但是不是刚上来就自动重装值的吧,是产生溢出中断后自动重装的,也 ...

嗯,这点我没想到,初始化函数里我加了TL1=0xFD后还是这样。而且我把发送的数据改为“0xff  0xbb  0xcc”后又出现新的状况:


"1"是讨论的现象,“2”是每次关电后出现的现象(多出个“00”),
我想估计是我这边硬件出了问题,因为论坛上有人用和我一样的程序实验确没出现“1”的现象,而且有时试验时中间接收某个“FF”会变成“FE”

使用特权

评论回复
30
JasonWangSE| | 2013-10-24 13:05 | 只看该作者
看串口初始化程序你使能了串口中断,能看一下你的串口中断处理程序是怎么样的么?

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
一切会如旧 + 2 很给力!
31
ballack_linux| | 2013-10-24 14:12 | 只看该作者
一切会如旧 发表于 2013-10-24 12:44
嗯,这点我没想到,初始化函数里我加了TL1=0xFD后还是这样。而且我把发送的数据改为“0xff  0xbb  0xcc” ...

呵呵 查查硬件吧。。。等结果出来记得共享下哈

使用特权

评论回复
32
JasonWangSE| | 2013-10-24 16:56 | 只看该作者
如果像程序中那样轮询检查TI,不使用中断模式,也没有挂接串口中断处理函数,建议将串口中断关掉吧

使用特权

评论回复
33
651927693| | 2013-10-25 00:17 | 只看该作者
Strange....

使用特权

评论回复
34
一切会如旧|  楼主 | 2013-10-25 17:02 | 只看该作者
JasonWangSE 发表于 2013-10-24 16:56
如果像程序中那样轮询检查TI,不使用中断模式,也没有挂接串口中断处理函数,建议将串口中断关掉吧 ...

串口中断关了,解决了!!(或者打开串口中断,把TI=0放在中断函数里,之前我是虽然打开了串口中断却没写中断函数)
膜拜啊!
就是关电时还是出现了多余的“00”(传输的数据是“0xFF  0xBB  0xCC”循环)

使用特权

评论回复
35
一切会如旧|  楼主 | 2013-10-25 17:07 | 只看该作者
ballack_linux 发表于 2013-10-24 14:12
呵呵 查查硬件吧。。。等结果出来记得共享下哈

上电总是多出一个数据(所发送的第一个数据)解决了,是因为我打开了串口中断却没写串口中断函数,关闭串口中断或者将TI复位的语句放进中断函数里就不回出现这种情况了。
但断电后会出现“00”的情况还不知道为啥(发送数据为“0xFF  0xBB  0xCC”)

使用特权

评论回复
36
handlike| | 2013-10-25 17:09 | 只看该作者
用的是232/485吧,应该是它的问题,可以不考虑它。

使用特权

评论回复
37
一切会如旧|  楼主 | 2013-10-25 17:11 | 只看该作者
一切会如旧 发表于 2013-10-25 17:07
上电总是多出一个数据(所发送的第一个数据)解决了,是因为我打开了串口中断却没写串口中断函数,关闭串 ...

但是为什么打开中断却没写中断函数会出现这种情况我就还没弄明白了。。。

使用特权

评论回复
38
一切会如旧|  楼主 | 2013-10-25 17:12 | 只看该作者
handlike 发表于 2013-10-25 17:09
用的是232/485吧,应该是它的问题,可以不考虑它。

232转USB,芯片是CH340

使用特权

评论回复
39
JasonWangSE| | 2013-10-25 18:18 | 只看该作者
一切会如旧 发表于 2013-10-25 17:11
但是为什么打开中断却没写中断函数会出现这种情况我就还没弄明白了。。。 ...

应该要看你的中断向量初始化程序是怎么写的了,可以看一下串口的中断向量处烧的是什么样的指令,跳到了哪里。我猜有可能是跳到了main函数,或者顺序执行到了main函数里。这样第一次调用sendByte时是在while中死等,一旦发送完成是先进串口中断的,这时TI的标志是刚发完的那个数据置的,中断中又去将第一个数据又写到了SBUF中,然后清掉TI继续往下执行,第一个字符发送了两次,中断也没有返回。所以我感觉你一直都是在串口中断当中跑的main函数。只是我个人的猜想哈

使用特权

评论回复
40
一切会如旧|  楼主 | 2013-10-25 22:04 | 只看该作者
JasonWangSE 发表于 2013-10-25 18:18
应该要看你的中断向量初始化程序是怎么写的了,可以看一下串口的中断向量处烧的是什么样的指令,跳到了哪 ...

我没有写中断向量初始化程序,我查看串口中断向量(0023H)那的数据是:54 12 00,不知道是啥意思,我看其他指令的机器码发现第一个数好像是指令,后面是操作数,查了一下,54代表操作时ANL与操作,我就不懂了。。。【加上中断函数时0023H那确实是指向中断函数的(数据为02 00 60,其中00 60 是中断函数的入口地址)】。
当我试着想验证你的猜想时,我把while(1)去掉:
void main()
{
InitUART();
  temp=0xff;
  SendByte(temp);
  delay(10000);
  temp=0xbb;
  SendByte(temp);
  delay(10000);
  temp=0xcc;
  SendByte(temp);
  delay(10000);
}
这样的话开头就没有异常了。。。

我就想是不是因为多了个while,导致了某种巧合,所以我就天上while,且在它之前加上小延迟函数:
void main()
{
InitUART();
delay(2);
while(1)
{
  temp=0xff;
  SendByte(temp);
  delay(10000);
  temp=0xbb;
  SendByte(temp);
  delay(10000);
  temp=0xcc;
  SendByte(temp);
  delay(10000);
}
}

开头异常变成“FF  CC  FF  BB  CC  FF  BB  CC....”
后来又实验,只要我在while前加点语句(如点亮LED),开头都会变异常(点亮LED时是:FF FF FF BB CC FF BB CC FF BB CC)。

哎,看来真可能是我这边硬件问题了。

使用特权

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

本版积分规则