BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #13600同步于 2013/7/10
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖

求助单片机串口通信

Sorosbupt
2013/7/10镜像同步11 回复
通信过程是单片机将4个字节的数据通过串口发给一个可调谐激光器用来控制波长,然后可调谐激光器再返回4个字节的数据。这个过程重复5次至少,当然,每次单片机发给可调谐激光器的是不同数据,返回的数据肯定也不同。 对于单片机收到的4个字节,怎么让他们分别存在不同的变量里呢?存他们的原因是一方面有checksum的验证,另外一方面,不同的4个字节表示不同的含义,需要区分…… 还有,这个小部分怎么放进程序整体呢?这个串口通信的过程来一次就够了,第二次就不需要了,要怎么实现? 跪求各位大神指教!!!
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
BYR20101992机器人#1 · 2013/7/14
用的什么单片机?定义单字节变量数组比如unsigned char x[4]放进去?控制串口中断的标志位让它不再产生中断就可以只发一次?
Sorosbupt机器人#2 · 2013/7/14
【 在 BYR20101992 的大作中提到: 】 : 用的什么单片机?定义单字节变量数组比如unsigned char x[4]放进去?控制串口中断的标志位让它不再产生中断就可以只发一次? 用的单片机是C8051,和89C51差不多。 假设定义单字节变量数组比如unsigned char x[4]放进去的话,我要进行很多次通信,是不是定义成二维数组比较好?还有,会不会发生一种情况是如果单片机没接收到第一个字节的话,以后所有的字节都错位了?譬如x[0]没接收到,所以x[1]x[2]被接收后被赋到了x[0]x[1]…… 谢谢你啦~
BYR20101992机器人#3 · 2013/7/14
我用过89C52,其中的SBUF是8位接受寄存器,可以接收一个字节吧~每当这个寄存器接收到了数据后就会引发串口中断,你从中断服务程序中读出这个字节,然后清串口中断标志,这样单片机会等待下一个字节的数据~重复四次就可以读出你要的数据。 如果单片机收不到数据就不会引起串口中断,也就不会读出这个数据,不用担心读错了 【 在 Sorosbupt 的大作中提到: 】 : 用的单片机是C8051,和89C51差不多。 : 假设定义单字节变量数组比如unsigned char x[4]放进去的话,我要进行很多次通信,是不是定义成二维数组比较好?还有,会不会发生一种情况是如果单片机没接收到第一个字节的话,以后所有的字节都错位了?譬如x[0]没接收到,所以x[1]x[2]被接收后被赋到了x[0]x[1]…… : 谢谢你啦~
BYR20101992机器人#4 · 2013/7/14
附一个我写的小程序你看看 #include<reg52.h> #define uchar unsigned char uchar a,flag; void main() { TMOD=0x20;//T116位定时计数器 TH1=0xfd; //设置波特率9600 TL1=0xfd; TR1=1; //打开定时器 SM0=0; SM1=1; //方式一 REN=1; //允许串口接收 EA=1; ES=1; //串口中断允许 PCON=0x80; // SMOD=1 while(1) { if(flag==1) { RI=0; ES=0; //关闭串口中断 flag=0; SBUF=a; while(!TI);//等待,直到接收到信息为止 TI=0; //发送中断标志位清零 ES=1;//打开串口中断 } } } void serial() interrupt 4 { P1=SBUF; a=SBUF; flag=1; RI=0; }
Sorosbupt机器人#5 · 2013/7/14
【 在 BYR20101992 的大作中提到: 】 : 附一个我写的小程序你看看 : #include<reg52.h> : #define uchar unsigned char : ................... 我现在是把收发两个中断都放在interrupt 4里,然后主函数里做的是将值赋给sbuf以开启发送过程。 现在的问题主要是收,譬如你要是收好多数据的话,要怎么存储呢?来一个长度可变的数组?a[]?
BYR20101992机器人#6 · 2013/7/14
你收的这些数据在程序运行期间是一直都有用?没用的你可以覆盖掉 【 在 Sorosbupt 的大作中提到: 】 : 我现在是把收发两个中断都放在interrupt 4里,然后主函数里做的是将值赋给sbuf以开启发送过程。 : 现在的问题主要是收,譬如你要是收好多数据的话,要怎么存储呢?来一个长度可变的数组?a[]?
Sorosbupt机器人#7 · 2013/7/14
【 在 BYR20101992 的大作中提到: 】 : 你收的这些数据在程序运行期间是一直都有用?没用的你可以覆盖掉 应该是四个一组,处理完了就可以不用了。怎么覆盖呢?这个的具体实现没太想好…… 非常感谢你,一直回复我呢~
BYR20101992机器人#8 · 2013/7/15
在串口中断里面加入for循环就行了吧?你看这样:x[4]表示单片机存放数据的单字节全局变量 unsigned char i=0; .... .... void serial interrupr 4 { i++; x[i]=SBUF; if(i==3) i=0; } 【 在 Sorosbupt 的大作中提到: 】 : 应该是四个一组,处理完了就可以不用了。怎么覆盖呢?这个的具体实现没太想好…… : 非常感谢你,一直回复我呢~
Sorosbupt机器人#9 · 2013/7/19
【 在 BYR20101992 的大作中提到: 】 : 在串口中断里面加入for循环就行了吧?你看这样:x[4]表示单片机存放数据的单字节全局变量 : unsigned char i=0; : .... : ................... 对,哈哈,谢谢你啦~对了,你有电平类型为3.3v lvttl的单片机吗?