PC传送“数值”字符字符串到单片机,单片机如何转换“数值”

#include <reg51.h>#include <intrins.h>sbit MG=P3^3; //电机电相输入隔离芯片74LS374控制端unsigned char ser[16];unsigned char Rmotor[]={0xfc,0xf9,0xf3,0xf6}; //步进电机顺时电相 接P0unsigned char temp,k=0;unsigned int run;delay(unsigned int Time) //毫秒级延时函数{ unsigned int i,j; for(i=Time;i>0;i--) for(j=120;j>0;j--);}serial_init() //9600bps串行通信协议{ TMOD=0x20; TH1=TL1=0xfd; TR1=1; SM0=0; SM1=1; REN=1; ES=1; EA=1;}motor_run(unsigned int Run) //步进电机角度顺时针转动函数{ unsigned int x,y=0; for(x=0;x<Run;x++) { P0=Rmotor[y]; _nop_(); MG=0; _nop_(); MG=1; if(x<48) {delay(5);} else delay(4); if(y>3){y=0;} }}run_build() //将从PC接收到的"数值"转换成单片机可处理的int并作为motor_run(unsigned int Run)的参量{ /* 假如PC传送1234#,则ser[]={✀1✀,✀2✀,✀3✀,✀4✀},该如何将它转换为变量run=1234 */ /* PC传送的数据长度是不确定的,取值范围从1~4800之间的任意值 */}main() //主程序{ serial_init(); while(1) { if(temp==✀#✀) { temp=0; ES=0; run_build(); //求解出PC指定步进电机需要转动多小"步" delay(5); if(run>0) { motor_run(run); //执行电机转动 } ES=1; k=0; } }}serial() interrupt 4 //单片机接收PC指令字符串{ if(RI) { RI=0; temp=SBUF; if(temp!=✀#✀) { ser[k]=temp; k++; } }}
2026年09月24日 15:29
有3个网友回答
网友(1):

int TQ( char n)//将字符转换成数字
{
if(n>=0x30 && n<=0x39) //如果接收的字符在指定的范围内
{
switch(n) //根据不同字符的十六进制码,返回相应的十进制数
{
case 0x30 : { return 0; }
case 0x31 : { return 1; }
case 0x32 : { return 2; }
case 0x33 : { return 3; }
case 0x34 : { return 4; }
case 0x35 : { return 5; }
case 0x36 : { return 6; }
case 0x37 : { return 7; }
case 0x38 : { return 8; }
case 0x39 : { return 9; }
}
}
else{ return 0; } //否则返回数字 0
}

void HB()//数据合并
{
for(j=0;j<4;)
{
if(aa[i]==0x20){ break; } //如果遇到空格,则结束
bb[j]=TQ(aa[i]); //将字符数据转换成数值数据
j++;i++;
}
switch(j)
{
case 4 : { m=bb[0]*1000 + bb[1]*100 + bb[2]*10 + bb[3]*1 ; return m; }
case 3 : { m=bb[0]*100 + bb[1]*10 + bb[2]*1 ; return m; }
case 2 : { m=bb[0]*10 + bb[1]*1 ; return m; }
case 1 : { m=bb[0]*1; return m; }//根据数据的有效位数来计算步数

default : { m=0; return m; }
}

我这是以空格作为结束符号的,你可以改成你自己使用的

如果有不懂或不知道如何使用,可以看我的资料有联络方式

网友(2):

/* 假如PC传送1234#,则ser[]={'1','2','3','4'},该如何将它转换为变量run=1234 */
/* PC传送的数据长度是不确定的,取值范围从1~4800之间的任意值 */
----
如下即可:

serial() interrupt 4 //单片机接收PC指令字符串
{
if(RI) {
RI = 0;
ser[k] = SBUF;
if(ser[k] == '#') {
run = 0;
for (i = 0; i < k; i++) run = run * 10 + (ser[i] - 48); //run 就是1234
k = 0;
}
else k++;
}
}

网友(3):

字符比十进制多48,‘0’+48=十进制了