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