串口啊串口

LongBow007 2008-11-17 08:03:15
我向串口发送数据时 本来是一桢数据,但在串口收到的却是两桢。请问这是怎么回事。
比如我向串口发送:
AA BB 00 CC 99
但我用串口调试精灵收到的却是:
AA BB
00 CC 99

我是这么发送的,当满足发送条件时调用下面的函数:
void send_info()
{
send_char_com(0x00);
send_char_com(0x01);
send_char_com(0x22);
send_char_com(0xff);
send_char_com(0xdd);
send_char_com(0xee);
send_char_com(0xcc);
send_char_com(0xbb);
send_char_com(0xaa);
send_char_com(0xa1);
send_char_com(0x11);
}
void send_char_com(unsigned char ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
...全文
236 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
LongBow007 2008-12-01
  • 打赏
  • 举报
回复
我的是dropdown@126.com
qq413187589 2008-12-01
  • 打赏
  • 举报
回复
52mcuarm@163.com我的邮箱留下,希望高手能发点好的代码看看!谢谢
sunxinyu 2008-11-22
  • 打赏
  • 举报
回复
帮顶
gooogleman 2008-11-22
  • 打赏
  • 举报
回复
楼主,你应该多看代码,真的。

我觉得现在你陷入了思维的死角。

我推荐各个牛人博客

给你——匠人百宝箱

还有,如果你弄不到什么好的程序,我传一些给你。
把邮箱贴出来。

我看你弄我都觉得辛苦了
LongBow007 2008-11-19
  • 打赏
  • 举报
回复
test_000_001 给我滚
LongBow007 2008-11-19
  • 打赏
  • 举报
回复
to gooogleman
是设置一个标志,让接收端知道开始接收了,然后设置一个结束标志,让接收端知道接收结束了。是这个意思吧? 谢谢
LongBow007 2008-11-19
  • 打赏
  • 举报
回复
to xybai:
贴全太长了,大家看起来很累。


unsigned char m0=0; //秒
void Delay()
{
int i;
for(i=0;i<0xff;i++)
{
}
}

LongBow007 2008-11-19
  • 打赏
  • 举报
回复
to gooogleman
“结束起始标志等。都不设定” 怎么样设定结束起始标记?
LongBow007 2008-11-19
  • 打赏
  • 举报
回复
test_000_001 你赶紧去看看医生吧
lbing7 2008-11-18
  • 打赏
  • 举报
回复
LZ哈

不知道是不是在中断里做这种事的问题

像这么那么累的活,别让中断来干了

xybai 2008-11-18
  • 打赏
  • 举报
回复
1.如果你接收使用16进制显示,那么假如你单片机发了换行符那就应该显示为0D(H).
2.最直接办法用示波器看下TX脚发送的数据的每位电平是否和你的程序一致.
3.你贴的程序也不完整,Delay()没有,中断里有个m0也不知道在啥地方用的。
gooogleman 2008-11-18
  • 打赏
  • 举报
回复
楼主逻辑明显有问题,定时器,又延时,结束起始标志等。都不设定,对定时器安排不合理,作用等。
zhujinqiang 2008-11-18
  • 打赏
  • 举报
回复
关注。
LongBow007 2008-11-18
  • 打赏
  • 举报
回复
我把发送放到主函数的循环里面还是不行
MBWQ 2008-11-17
  • 打赏
  • 举报
回复
这个是正常的
LongBow007 2008-11-17
  • 打赏
  • 举报
回复
我自己写了一个接收串口的主机程序, 还是不能正确接收我单片机发的信息,但是能正确接收大傻串口调试软件发送的信息。

哎,明天用c51写个只有串口发送的精简的程序,看能不能正确的收发。
zyzhang365 2008-11-17
  • 打赏
  • 举报
回复
个人觉得可能是串口助手不适合你的应用, 因为读到的数据是正确的. 串口助手内部怎么实现也不是很清楚, 估计读请求在一定时间内就返回了, 这时缓冲区数据还没有全部准备好.

如果有条件自己用串口控件写一个主机程序.
LongBow007 2008-11-17
  • 打赏
  • 举报
回复
我把send_info()放到 tim_0(void) 里面也不行

我用的是大傻串口调试软件
LongBow007 2008-11-17
  • 打赏
  • 举报
回复
void send_info()
{
send_char_com(0x00);
send_char_com(0x01);
send_char_com(0x22);
send_char_com(0xff);
send_char_com(0xdd);
send_char_com(0xee);
send_char_com(0xcc);
send_char_com(0xbb);
send_char_com(0xaa);
send_char_com(0xa1);
send_char_com(0x11);
}
我这个函数里既没有帧开始标志,也没有帧结束标志。计算机怎么会知道它是一帧呢? 也就是说计算机怎么知道该不该换行呢
LongBow007 2008-11-17
  • 打赏
  • 举报
回复

void send_char_com(unsigned char ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
void send_info()
{
send_char_com(0x00);
send_char_com(0x01);
send_char_com(0x22);
send_char_com(0xff);
send_char_com(0xdd);
send_char_com(0xee);
send_char_com(0xcc);
send_char_com(0xbb);
send_char_com(0xaa);
send_char_com(0xa1);
send_char_com(0x11);
}

main()
{
EA=1;

PS=1;//串行中断为高优先级
PT0=0;// 串行中断为低优先级

TMOD=0x21;
//定时时间50ms
TH0= -46080/256;
TL0= -46080%256;
//定时器1,产生9600波特率
TH1=0xFD;
TL1=0xFD;
PCON=0;

SCON=0x50;//串行通信工作于方式1
TR1=1;

ET0=1;
TR0=1;


while(1)
{
send_info();
//延时
Delay();
Delay();
Delay();

}
}


//产生1秒的时间
void tim_0(void) interrupt 1 using 2
{
static count=0;
if(count==20)
{
m0++;
count=0;
//send_info();
}
count++;


TH0= -46080/256;
TL0= -46080%256;
}



加载更多回复(3)

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧