c语言串口 writefile返回997_找工作、面试极可能遇到的五个C语言知识点

#科技V计划#

C语言常见常用的知识点很多,下面是工作中或者找找工作面试时经常会遇到几个问题。

1、浮点数(float)怎么使用串口通信?怎么拆分?怎么组合恢复?

//定义数据结构

typedef union{

float Data;//定义浮点数据(占4个字节)

struct

{

u8 b1,b2,b3,b4;//顺序不能调整

}Field;

}FloatToByte_t;

//浮点数转换成字节(出来即可通过串口发送)

void TransFloatToBytes(FloatToByte_t InData,u8 *buff)

{

*buff++=InData.Field.b1;

*buff++=InData.Field.b2;

*buff++=InData.Field.b3;

*buff++=InData.Field.b4;

}

//将字节转换为浮点数,从字节回复为浮点数

float TransBytesToFloat(u8 *buff)

{

FloatToByte_t temp;

temp.Field.b1=*buff++;

temp.Field.b2=*buff++;

temp.Field.b3=*buff++;

temp.Field.b4=*buff++;

return temp.Data;

}

测试代码如下

void TestFloatToByte(void)

{

bool equal=FALSE;

u8 i,uBuff[4];

float fInput=0.123456,fOutput;

FloatToByte_t InData;

printf(" --------------------------------- ");

for(i=0;i<10;i++)

{

fInput+=1.01;//待转换浮点数据

InData.Data=fInput;

TransFloatToBytes(InData,uBuff);//浮点数转换为字节

fOutput=TransBytesToFloat(uBuff);//字节转换为浮点数

if(fInput==fOutput)equal=TRUE;//判断转换前后是否相等

else equal=FALSE;

printf(" num=%d fInput=%f fOutput=%f equal=%d",i,fInput,fOutput,equal);

}

printf(" --------------------------------- ");

}

测试结果如下图

8ba538be5071997f44cbd0764ac65ba7.png

浮点数查分与恢复测试结果

2、如何拆分一个16位变量为两字节?移位法还是除法?结果有什么不同?

u8 B1,B2;

i16 Temp16A=InputData,Temp16B;

//移位法

B1=(u8)(Temp16A>>8);

B2=(u8)Temp16A;

//除法

B1=(u8)(Temp16A/256);

B2=(u8)(Temp16A%256);

//思考以上两个方法的不同(假如用于通信,接收方是否能回复原始数据)

一下是测试功能函数

void TestData(i16 InputData)

{

u8 B1,B2;

i16 Temp16A=InputData,Temp16B;

B1=(u8)(Temp16A>>8);

B2=(u8)Temp16A;

printf(" Temp16A=0x%04X %d",Temp16A,Temp16A);

printf(" A B1=0x%X B2=0x%X",B1,B2);

Temp16B=(B1<<8)+B2;

printf(" 移位法恢复数据 Temp16B=0x%04X %d ",Temp16B,Temp16B);

B1=(u8)(Temp16A/256);

B2=(u8)(Temp16A%256);

printf(" A B1=0x%X B2=0x%X",B1,B2);

Temp16B=(B1*256)+B2;

printf(" 除法恢复数据 Temp16B=0x%04X %d ",Temp16B,Temp16B);

}

输出结果如下图:

2473b67027da1f8c231aa209a03030b1.png

移位法恢复数据与除法恢复数据不一样

由上图可见移位法拆分与恢复数据正确,除法拆分与恢复数据不一致。编程过程中优先使用移位法拆分变量。当然用联合体也可以。

3、如何快速高效的计算一个变量1的个数?不使用循环计算?

const u8 TableOf1InVar[]={0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4};//建立1的数据表

u8 GetU8Number1Amount(u8 Data)//计算8位变量1的个数

{

u8 cnt;

cnt=TableOf1InVar[Data & 0x0F];

cnt+=TableOf1InVar[Data>>4];

return cnt;

}

u8 GetU16Number1Amount(u16 Data)//计算16位变量1的个数

{

u8 cnt;

cnt=TableOf1InVar[(Data>>0) & 0x0F];

cnt+=TableOf1InVar[(Data>>4) & 0x0F];

cnt+=TableOf1InVar[(Data>>8) & 0x0F];

cnt+=TableOf1InVar[(Data>>12) & 0x0F];

return cnt;

}

u8 GetU32Number1Amount(u32 Data)//计算32位变量1的个数

{

u8 cnt;

cnt=TableOf1InVar[(Data>>0) & 0x0F];

cnt+=TableOf1InVar[(Data>>4) & 0x0F];

cnt+=TableOf1InVar[(Data>>8) & 0x0F];

cnt+=TableOf1InVar[(Data>>12) & 0x0F];

cnt+=TableOf1InVar[(Data>>16) & 0x0F];

cnt+=TableOf1InVar[(Data>>20) & 0x0F];

cnt+=TableOf1InVar[(Data>>24) & 0x0F];

cnt+=TableOf1InVar[(Data>>28) & 0x0F];

return cnt;

}

4、如何通过一个函数判断芯片的大小端?是大端返回帧,小端返回假。

typedef union

{

u16 dat;

struct

{

u8 a;

u8 b;

}f;

}MucEndian_t;

bool isBigEnd(u16 data)

{

u8 temp8;

MucEndian_t temp;

temp.dat=data;

temp8=data>>8;

if(temp.f.a==temp8)

return TRUE;

else

return FALSE;

}

5、如何定义一个32位变量其地址指向指定定值?并设置变量值为0x12345678

u32 TestFixVar1 __attribute__((at(0x20000100))) = 0x12345678;

void TestFixVar(void)

{

printf(" X1 TestFixVar=0x%X %X ",(u32)(&TestFixVar1),TestFixVar1);//输出地址与变量的值

TestFixVar1=0x87653421;//更改变量的值

printf(" X2 TestFixVar=0x%X %X ",(u32)(&TestFixVar1),TestFixVar1);//输出地址与变量的值

}

测试结果如下图:

46b53d7ebfe61c032490b8d081d6acd3.png

变量测试结果

如上图可见,变量定位定义与测试输出一致。

总结:以上就是本次分享的五个C语言基本知识点,希望对大家有用。当然C语言还有很多其他知识点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值