㈠ 51单片机串口接收字符串
51单片机串口接收字符串,接收的字符串长度不定,无结束符,要判断这个字符串结束,确实比较难。如果每个字符串还是连续发送,几乎是无法判断的。如果每个字符串之前有一定的空闲时间,可以根据最短的空闲时间来判断结束。即接收每一个字符都开始计时,接收下一个字符结束计时,如果计时的时间超过最短的空闲时间,则前一个字符为结束,且新字符串开始。并再重新计时。
㈡ C51单片机如何从PC机串口接收字符串
我的程序的一部分,供参考
//主流程
void main(void)
{
//系统初始化
SCON = 0x50; //串口方式为1,SM2= 0,TB8= 1
PCON = 0x80; // SMOD=1
TMOD = 0x22; //设定定时器0/1的工作模式为方式2
//设置T0中断的定时时间为1/7200毫秒
TH0 = 0x00;
TL0 = 0x00;
//设置异步串口的波特率
//TH1 = 0x0f4; //OSC = 11.0592MHz bps = 4800 SMOD=1
//TL1 = 0x0f4;
TH1 = 0x0fd; //OSC = 11.0592MHz bps = 19200 SMOD=1
TL1 = 0x0fd;
//设置中断优先级,T0中断为高优先级中断,其他为低优先级中断
IP = 0x02; // 设置中断优先级--T0为高优先级,其他低
ET0 = 1; //定时器0中断
ES = 1; //串行接口中断
EA = 1; //系统中断允许
TR0 = 1; //启动定时器0
TR1 = 1;
......................
//串口接收中断处理程序
//发送采用查询处理
void SerialComm(void) interrupt 4
{
_pReceive[_cReceive] = SBUF;
_cReceive ++;
if(_cReceive >= RecBuffSize) _cReceive = 0;
RI = 0;
}
//串口发送一个字节
//senddata:需要发送的数据
void SendOneByte(unsigned char senddata)
{
ES = 0;
TI = 0;
SBUF = senddata;
while(TI == 0);
TI = 0;
ES = 1;
}
㈢ 51单片机串口收发字符串求助
51单片机串口发字符串的方法有多种,比较容易理解的方法是:先定义一个要发送的字符串,就是一个字符串数组。
发送时,连续发送个数组。
接收字符串,也可以采用类似的方法,先声明一个字符串,接收时,每接收一个就存入这个串中,接收结束,查这个字符串就行了。
㈣ 51单片机 串口通信 检查接收的字符串
首先SBUF只有8位 即一字节,而"adcd"有4字节+‘ ’个,你这把temp和“abcd”比较永远只能为假。所以LED1=!LED1;这条语句不能执行。正确的做法是建立一个变量,将SBUF接受到的字符存入变量,然后再比较
㈤ 单片机怎么接收字符串
void init_ser(){ TMOD=0X20;//定时器1工作在方式2 TH1=0XFD; TL1=0XFD; //波特率9600 TR1=1; EA=1; SM0=0; SM1=1; REN=1;//允许串口接收 ES=1;//开串口 中断 }void delay(unint z){ unint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }void ser() interrupt 4 //中断函数不用声明 { if(RI==1) { RI=0; ser_receive=SBUF; if(ser_receive=='a') { m=1; } if( m==1 && ser_receive!='z') { receive_data[i]=ser_receive; i++;// if(i==36)// {// i=0;// ser_flag=1;// } } else if (ser_receive=='z') { i=0; m=0; ser_flag=1; xianshi=1; } } }void uart(){ if(ser_flag==1) { ES=0; ser_flag=0; for(j=0;j<57;j++) { SBUF=receive_data[j]; while(!TI); TI=0; delay(10); } ES=1; }}我刚写的,接受以a开始,以z结束的字符串,测试没问题。
㈥ 请问51单片机如何接收字符串
上位机 与 下位机,发送 与 接收 一串数据,单片机接收 是一个字节 一个字节 接收的
需要有 通讯协议,可以自己设计 一个 如 多机通讯
指令码 机器号 数据1 数据2 - - - 数据n 校验码 结束码
这样 单片机可以判断 接收的数据 类型,接收到数据 先存放在 缓冲区,收到结束码后
再判断 指令 是否是 本机数据,是再按照 数据类型处理。
㈦ 51单片机串口用数组接收字符串程序怎么写
对于固定的数据,可以通过顺序判断来识别用if或switch语句来判决即可
通过串口中断,每次进入把SBUF的值赋给T,通过判决、累加NUM的值最终取得冒号后面的数值(不知楼主是否是要最后的数值)
voidUART_Int(void)interrupt4
{
staticucharNUM=0;
ucharT;
if(RI==1)
{
RI=0;
T=SBUF;//接收串口数据
switch(T)//如果是按value":0的顺序读进的话会最终触发NUN=7的条件
{
case'v':
NUM=1;
break;
case'a':
if(NUM==1)
{
NUM=2;
}
else
{
NUM=0;
}
break;
case'l':
if(NUM==2)
{
NUM=3;
}
else
{
NUM=0;
}
break;
case'u':
if(NUM==3)
{
NUM=4;
}
else
{
NUM=0;
}
break;
case'e':
if(NUM==4)
{
NUM=5;
}
else
{
NUM=0;
}
break;
case'"':
if(NUM==5)
{
NUM=6;
}
else
{
NUM=0;
}
break;
case':':
if(NUM==6)
{
NUM=7;
}
else
{
NUM=0;
}
break;
default:
if(NUM==7)
{
LED=T; //LED为全局变量
}//把最后的数据传给LED
NUM=0;
break;
}
}
}
㈧ 请问51单片机怎么通过串口接收字符串能解释一下代码吗谢谢了
看流程是什么了,如果等待14个字节接收完,那就是for循环,或者while等待。如果只是接收的话,就中断,然后去读数组,超过14个字节就处理。
㈨ 单片机 串口接收的字符串如何转为字符
楼主你好,楼上兄弟说的太复杂了,
恕我直言
没看懂你想说明神马问题,串口接收到的字符串如何转化成字符,首先字符串是字符的连续储存方式,那么
例:
1char temp[4] = { A, B, C };这是一个标准字符串
那么temp[0]=='A';为真
以此类推temp[1]
=='B'
1temp[3] == '/0';//c语言字符串结尾标示符./0转义符
如果你想显示中文那么
中文是16bit的,双字节字符
1234short temp;temp=sbuf;将第一个数据获取回来 temp<<=8;将数据左移8位temp|=sbuf;将第二次的数据带入进来
可能会我记错了高低位顺序,要是出错可以反过来即可!
小弟告诉你一个最简单最实用的办法
如何把字符中的数字变成变量数据
switch
你会用么
就是开关选择语句
123456789static char temp;//申明一个变量 这是个全局静态变量temp = sbuf;switch(temp) {case '0':temp = 0; break;//break必须要加,否则数据覆盖case '1':temp = 1; break;case '2':temp = 2;break;...}
以此类推
,这样你的道的字符串或字符数据则能变成数据,
字符串也只是数组而已
而楼主想要的字符也就是其中的一个元素罢了
可以用指针方式提取
亦可以用数组下标提取!这用的都是ascll码
但是不需要理解到码表上
请楼主明察抢答时间
,楼下请勿复制,祝楼主早日解决程序问题,加油加油
㈩ 串口通信时 如何让单片机接收以特定字符开头的字符串,比如“a 10 11 12 13 ff ” 如果判断发过来的字符串
你可以开辟一个缓冲区,Buf[100],做成一个循环队列,串口中断里面接收到一个字符,就往队列里面添加接收到的新字符。主程序里面查询是否连续几个字符为你定义的包头:“a 10 11 12 13 ff ” ,如果是,就开始处理以下的字符。