电工基础知识_电工技术-电工最常见电路

当前位置: 电工基础主页 > 电工基础 >

分享几个实用的嵌入式C程序代码块

时间:2023-11-17 11:26来源:未知 作者:admin 点击:
在学习和工作开发的时候,经常需要使用到各种各样不太常用的操作,这种情况一般是自己手动写一些小程序来处理。因为它们不太常用,所以经常用了又没保存,等到下一次在使用的

在学习和工作开发的时候,经常需要使用到各种各样不太常用的操作,这种情况一般是自己手动写一些小程序来处理。因为它们不太常用,所以经常用了又没保存,等到下一次在使用的时候又需要重写,这样的非常浪费时间和精力。
所以想在这里统一记录一下,以备下次重新使用。代码以实用为主,如果缺陷,欢迎指出。

1 十六进制字符转整型数字

功能:

将16进制的字符串转换为10进制的数字。我是没有找到相应的库函数,所以参考网上的代码自己手动写了个函数来实现。

常用的函数有atoi,atol,他们都是将10进制的数字字符串转换为int或是long类型,所以在有些情况下不适用。

/*=============================================================================#     FileName: hex2dec.cpp#         Desc: Convert a hex string to a int number#       Author: Caibiao Lee#      Version: #   LastChange: 2018-11-26 #      History:=============================================================================*/#include   #include   #include   #include int c2i(char ch)  {      // 如果是数字,则用数字的ASCII码减去48, 如果ch = '2' ,则 '2' - 48 = 2      if(isdigit(ch))              return ch - 48;      // 如果是字母,但不是A~F,a~f则返回      if( ch < 'A' || (ch > 'F' && ch < 'a') || ch > 'z' )              return -1;      // 如果是大写字母,则用数字的ASCII码减去55, 如果ch = 'A' ,则 'A' - 55 = 10      // 如果是小写字母,则用数字的ASCII码减去87, 如果ch = 'a' ,则 'a' - 87 = 10      if(isalpha(ch))              return isupper(ch) ? ch - 55 : ch - 87;      return -1;  } int hex2dec(char *hex)  {      int len;      int num = 0;      int temp;      int bits;      int i;      char str[64] = {0}; if(NULL==hex) {  printf("input para error ");  return 0; } if(('0'==hex[0])&&(('X'==hex[1])||('x'==hex[1]))) {  strcpy(str,&hex[2]); }else {  strcpy(str,hex); } printf("input num = %s ",str);    // 此例中 str = "1de" 长度为3, hex是main函数传递的      len = strlen(str);      for (i=0, temp=0; i

2 字符串转整型

功能:

将正常输入的16进制或是10进制的字符串转换为int数据类型。

/*=============================================================================#     FileName: hex2dec.cpp#         Desc: Convert a hex/dec string to a int number#       Author: Caibiao Lee#      Version: #   LastChange: 2018-12-03 #      History:=============================================================================*/#include   #include   #include   #include int String2int(char *strChar){ int len=0; const char *pstrCmp1="0123456789ABCDEF"; const char *pstrCmp2="0123456789abcdef"; char *pstr=NULL; int uiValue=0; int j=0;  unsigned int t=0; int i=0; if(NULL==strChar)  return -1; if(0>=(len=strlen((const char *)strChar)))  return -1; if(NULL!=(pstr=strstr(strChar,"0x"))||NULL!=(pstr=strstr(strChar,"0X"))) {  pstr=(char *)strChar+2;  if(0>=(len=strlen((const char *)pstr)))   return -1;  for(i=(len-1);i>=0;i--)  {   if(pstr[i]>'F')   {    for(t=0;t

3 创建文件并填充固定数据

功能:

创建固定大小的一个文件,并且把这个文件填充为固定的数据。

/*=============================================================================#     FileName: CreateFile.cpp#         Desc: 创建固定大小的文件,然后填充固定的数据#       Author: Caibiao Lee#      Version: #   LastChange: 2018-11-26 #      History:=============================================================================*/#include   #include   #include   #include //#define FILL_DATA_VALUE  0xff#define FILL_DATA_VALUE  0x30 //char 0int c2i(char ch)  {      if(isdigit(ch))              return ch - 48;      if( ch < 'A' || (ch > 'F' && ch < 'a') || ch > 'z' )              return -1;      if(isalpha(ch))              return isupper(ch) ? ch - 55 : ch - 87;      return -1;  } int hex2dec(char *hex)  {      int len;      int num = 0;      int temp;      int bits;      int i;      char str[64] = {0}; if(NULL==hex) {  printf("input para error ");  return 0; } if(('0'==hex[0])&&(('X'==hex[1])||('x'==hex[1]))) {  strcpy(str,&hex[2]); }else {  strcpy(str,hex); } printf("input num = %s ",str);    len = strlen(str);      for (i=0, temp=0; i

运行结果:

biao@ubuntu:~/test/flash$ gcc CreateFile.cpp biao@ubuntu:~/test/flash$ lsa.out  CreateFile.cpp  hex2dec.cpp  main.cpp  out.binbiao@ubuntu:~/test/flash$ ./a.out ./out.bin 0x10input num = 10 Need To Write Data Len 16 Fill Data Vale = 0x30 biao@ubuntu:~/test/flash$ lsa.out  CreateFile.cpp  hex2dec.cpp  main.cpp  out.binbiao@ubuntu:~/test/flash$ vim out.bin   1 0000000000000000   

4 批量处理图片

功能:

批处理将图片前面固定的字节数删除。

/*=============================================================================#     FileName: CutFile.cpp#         Desc: 批量处理,将图片的前面固定字节删除#       Author: Caibiao Lee#      Version: #   LastChange: 2018-11-26 #      History:=============================================================================*/#include #include #include #include #include #define START_READ_POSITION  128#define PHOTO_START_TIME  83641//l_s32PhotoTime = 92809;int Cut_file(char * InputFile){ FILE *l_pFileInput = NULL; FILE *l_pFileOutput = NULL; char l_ars8OutputName[128] = {0}; unsigned char l_arru8TempData[1024] = {0}; int l_s32Ret = 0; static unsigned int ls_u32Num = 0; if(NULL== InputFile)  {  goto ERROR; } //sprintf(l_ars8OutputName,"./outfile/_%s",&InputFile[8]); sprintf(l_ars8OutputName,"./outfile/00%d.jpg",ls_u32Num++); //printf("out file name %s ",l_ars8OutputName); l_pFileInput = fopen(InputFile,"rb+"); if(NULL==l_pFileInput) {  printf("input file open error");  goto ERROR; } l_pFileOutput = fopen(l_ars8OutputName,"w+"); if(NULL==l_pFileOutput) {  printf("out file open error");  goto ERROR; } fseek(l_pFileInput,START_READ_POSITION,SEEK_SET); while(!feof(l_pFileInput)) {  l_s32Ret = fread(l_arru8TempData,1,1024,l_pFileInput);  if(l_s32Ret<0)  {   break;  }  l_s32Ret = fwrite(l_arru8TempData,1,l_s32Ret,l_pFileOutput);  if(l_s32Ret<0)  {   break;  } }ERROR: if(NULL!=l_pFileOutput) {  fclose(l_pFileOutput);  l_pFileOutput =NULL; }; if(NULL !=l_pFileInput); {  fclose(l_pFileInput);  l_pFileInput =NULL; }}int main(void){ char l_arrs8InputName[128] = {0}; char l_s8PhotoChannel = 0; int  l_s32PhotoTime = 0; l_s8PhotoChannel = 3; l_s32PhotoTime = PHOTO_START_TIME; /**从第一通道开始**/ for(int j=1;j

运行结果:

biao@ubuntu:~/test/photo$ gcc CutFile.cpp biao@ubuntu:~/test/photo$ lsa.out  CutFile.cpp  image  outfilebiao@ubuntu:~/test/photo$ ./a.out ./image/1Y083642.jpg./image/1Y083714.jpg./image/1Y083747.jpg./image/1Y083820.jpg./image/1Y083853.jpg./image/1Y083925.jpg./image/1Y084157.jpg./image/1Y084228.jpg./image/1Y084301.jpg./image/1Y084334.jpg./image/1Y084406.jpg./image/1Y084439.jpg./image/1Y084711.jpg./image/1Y084742.jpg./image/1Y173524.jpg./image/1Y173556.jpg./image/1Y173629.jpg./image/1Y173702.jpg./image/1Y173933.jpg./image/1Y174004.jpg./image/1Y174244.jpg./image/1Y174315.jpg./image/1Y174348.jpg./image/1Y174420.jpg./image/1Y174454.jpg./image/1Y174733.jpgbiao@ubuntu:~/test/photo$ tree.├── a.out├── CutFile.cpp├── image│   ├── 1Y083642.jpg│   ├── 1Y083714.jpg│   ├── 1Y083747.jpg│   ├── 1Y083820.jpg│   ├── 1Y083853.jpg│   ├── 1Y083925.jpg│   ├── 1Y084157.jpg│   ├── 1Y084228.jpg│   ├── 1Y084301.jpg│   ├── 1Y084334.jpg│   ├── 1Y084406.jpg│   ├── 1Y084439.jpg│   ├── 1Y084711.jpg│   ├── 1Y084742.jpg│   ├── 1Y173524.jpg│   ├── 1Y173556.jpg│   ├── 1Y173629.jpg│   ├── 1Y173702.jpg│   ├── 1Y173933.jpg│   ├── 1Y174004.jpg│   ├── 1Y174244.jpg│   ├── 1Y174315.jpg│   ├── 1Y174348.jpg│   ├── 1Y174420.jpg│   ├── 1Y174454.jpg│   └── 1Y174733.jpg└── outfile    ├── 000.jpg    ├── 0010.jpg    ├── 0011.jpg    ├── 0012.jpg    ├── 0013.jpg    ├── 0014.jpg    ├── 0015.jpg    ├── 0016.jpg    ├── 0017.jpg    ├── 0018.jpg    ├── 0019.jpg    ├── 001.jpg    ├── 0020.jpg    ├── 0021.jpg    ├── 0022.jpg    ├── 0023.jpg    ├── 0024.jpg    ├── 0025.jpg    ├── 002.jpg    ├── 003.jpg    ├── 004.jpg    ├── 005.jpg    ├── 006.jpg    ├── 007.jpg    ├── 008.jpg    └── 009.jpg2 directories, 54 filesbiao@ubuntu:~/test/photo$ 
运行前需要创建两个目录,image用来存放需要处理的图片,outfile用来存放处理过后的文件。这种处理文件批处理方式很暴力,偶尔用用还是可以的。

5 IO控制小程序

嵌入式设备系统一般为了节省空间,一般都会对系统进行裁剪,所以很多有用的命令都会被删除。在嵌入式设备中要调试代码也是比较麻烦的,一般只能看串口打印。现在写了个小程序,专门用来查看和控制海思Hi3520DV300芯片的IO电平状态。

/*=============================================================================#     FileName: Hi3520_IO_CTRL.cpp#         Desc: Hi3520DV300 IO Write and  Read#       Author: Caibiao Lee#      Version: #   LastChange: 2018-11-30#      History:=============================================================================*/#include #include #include "hstGpioAL.h"int PrintfInputTips(char *ps8Name){ printf("=========== error!!! ========"); printf("usage Write: %s GPIO bit value ", ps8Name); printf("usage Read : %s GPIO bit ", ps8Name); printf("eg Write 1 to GPIO1_bit02  :     %s 1 2 1", ps8Name); printf("eg Read  GPIO1_bit02 Value :     %s 1 2 ", ps8Name); printf("=============BT20==================") printf("USB HUB    GPIO_0_2  1_UP; 0_Down "); printf("RESET_HD   GPIO_13_0 0_EN; 1_disEN"); printf("Power_HD   GPIO_13_3 1_UP; 0_Down "); return 0;}int main(int argc, char **argv){ if((3!=argc)&&(4!=argc)) {  PrintfInputTips(argv[0]);  return -1; } unsigned char l_u8GPIONum = 0; unsigned char l_u8GPIOBit = 0; unsigned char l_u8SetValue = 0; GPIO_GROUP_E  l_eGpioGroup; GPIO_BIT_E   l_eBit; GPIO_DATA_E   l_eData; l_u8GPIONum   = atoi(argv[1]); l_u8GPIOBit   = atoi(argv[2]); if(l_u8GPIONum<14) {  l_eGpioGroup = (GPIO_GROUP_E)l_u8GPIONum; }else {  printf("l_u8GPIONum error l_u8GPIONum = %d",l_u8GPIONum);  return -1; }; if(l_u8GPIOBit<8) {  l_eBit = (GPIO_BIT_E)l_u8GPIOBit; }else {  printf("l_u8GPIOBit error l_u8GPIOBit = %d",l_u8GPIOBit);  return -1; } if(NULL!=argv[3]) {  l_u8SetValue = atoi(argv[3]);  if(0==l_u8SetValue)  {   l_eData = (GPIO_DATA_E)l_u8SetValue;  }else if(1==l_u8SetValue)  {   l_eData = (GPIO_DATA_E)l_u8SetValue;  }else  {   printf("l_u8SetValue error l_u8SetValue = %d",l_u8SetValue);  } } if(3==argc)                                                        {/**read**/                                                                                                                                                           printf("read GPIO%d Bit%d ",l_u8GPIONum,l_u8GPIOBit);                   /**set input**/                                                       HstGpio_Set_Direction(l_eGpioGroup, l_eBit, GPIO_INPUT);                             /**read **/                                                                                    char l_s8bit_val = 0;                                                                          HstGpio_Get_Value(l_eGpioGroup, l_eBit, &l_s8bit_val);                                         printf("read Data = %d ",l_s8bit_val);                                                     }else if(4==argc)                                                                                {/**write**/                                                                                                                                                                                   printf("Write GPIO %d; Bit %d; Value %d",l_u8GPIONum,l_u8GPIOBit,l_u8SetValue);                /***set IO output*/                                                                              HstGpio_Set_Direction(l_eGpioGroup, l_eBit, GPIO_OUPUT);                                         /**Write To IO**/     HstGpio_Set_Value(l_eGpioGroup,l_eBit,l_eData);   }else                                               {                                                                                                } return 0;}

6 文件固定位置插入数据

在文件的固定位置插入固定的数据。

#include #include #include #define BASIC_FILE_NAME  "./nandflash.bin"#define UBOOT_FILE_NAME  "./u-boot.bin"#define KERNEL_FILE_NAME "./kernel.bin"#define ROOTFS_FILE_NAME "./rootfs.bin"#define APP_FILE_NAME  "./app.bin"#define UBOOT_POSITION  0x00#define KERNEL_POSITION  0x100000#define ROOTFS_POSITION  0x500000#define APP_POSITION  0x2700000int InsertData(FILE *pfBasic,FILE *psInsert,int s32Position){ int l_S32Ret = 0; unsigned char l_arru8Temp[1024] = {0xff}; fseek(pfBasic,s32Position,SEEK_SET); fseek(psInsert,0,SEEK_SET); while(1) {  l_S32Ret = fread(l_arru8Temp,1,1024,psInsert);  if(l_S32Ret > 0)  {   l_S32Ret = fwrite(l_arru8Temp,1,l_S32Ret,pfBasic);   if(l_S32Ret<=0)   {    printf("line %d error l_S32Ret = %d ",__LINE__,l_S32Ret);    return -1;   }  }else  {   break;  } } return 0;}int main(void){ int l_s32Ret = 0; FILE *l_pfBasec = NULL; FILE *l_pfUboot = NULL; FILE *l_pfKernel = NULL; FILE *l_pfRootfs = NULL; FILE *l_pfApp = NULL; l_pfBasec = fopen(BASIC_FILE_NAME,"r+"); if(NULL==l_pfBasec) {  printf("line %d error ",__LINE__);  goto ERROR; } l_pfUboot = fopen(UBOOT_FILE_NAME,"r"); if(NULL==l_pfUboot) {  printf("line %d error ",__LINE__);  goto ERROR; } l_pfKernel = fopen(KERNEL_FILE_NAME,"r"); if(NULL==l_pfKernel) {  printf("line %d error ",__LINE__);  goto ERROR; } l_pfRootfs = fopen(ROOTFS_FILE_NAME,"r"); if(NULL==l_pfRootfs) {  printf("line %d error ",__LINE__);  goto ERROR; } l_pfApp = fopen(APP_FILE_NAME,"r"); if(NULL==l_pfApp) {  printf("line %d error ",__LINE__);  goto ERROR; } if(0> InsertData(l_pfBasec,l_pfUboot,UBOOT_POSITION)) {  printf("line %d error ",__LINE__);  goto ERROR; } if(0> InsertData(l_pfBasec,l_pfKernel,KERNEL_POSITION)) {  printf("line %d error ",__LINE__);  goto ERROR; } if(0> InsertData(l_pfBasec,l_pfRootfs,ROOTFS_POSITION)) {  printf("line %d error ",__LINE__);  goto ERROR; } if(0> InsertData(l_pfBasec,l_pfApp,APP_POSITION)) {  printf("line %d error ",__LINE__);  goto ERROR; }ERROR: if(NULL!=l_pfBasec) {  fclose(l_pfBasec);  l_pfBasec = NULL; } if(NULL!=l_pfUboot) {  fclose(l_pfUboot);  l_pfUboot = NULL; } if(NULL!=l_pfKernel) {  fclose(l_pfKernel);  l_pfKernel = NULL; } if(NULL!=l_pfRootfs) {  fclose(l_pfRootfs);  l_pfRootfs = NULL; } if(NULL!=l_pfApp) {  fclose(l_pfApp);  l_pfApp = NULL; } return 0;}

7 获取本地IP地址

linux设备中获取本地IP地址可以使用下面的程序,支持最大主机有三个网口的设备,当然这个网卡数可以修改。

#include #include #include #include #include int get_local_ip(char *ps8IpList){    struct ifaddrs *ifAddrStruct;    char l_s8IpAddr[INET_ADDRSTRLEN];    void *tmpAddrPtr;    int l_s32IPCount = 0;    getifaddrs(&ifAddrStruct);    while (ifAddrStruct != NULL)     {        if (ifAddrStruct->ifa_addr->sa_family==AF_INET)        {            tmpAddrPtr=&((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr;            inet_ntop(AF_INET, tmpAddrPtr, l_s8IpAddr, INET_ADDRSTRLEN);            if (strcmp(l_s8IpAddr, "127.0.0.1") != 0)             {                if(l_s32IPCount == 0)                {                        memcpy(ps8IpList, l_s8IpAddr, INET_ADDRSTRLEN);                } else                 {                        memcpy(ps8IpList+INET_ADDRSTRLEN, l_s8IpAddr, INET_ADDRSTRLEN);                }                l_s32IPCount++;            }        }        ifAddrStruct=ifAddrStruct->ifa_next;    }    freeifaddrs(ifAddrStruct);    return l_s32IPCount;}int main(){    char l_arrs8IpAddrList[3][INET_ADDRSTRLEN];    int l_s32AddrCount;    memset(l_arrs8IpAddrList, 0, sizeof(l_arrs8IpAddrList));    l_s32AddrCount = get_local_ip(*l_arrs8IpAddrList);    for(l_s32AddrCount;l_s32AddrCount>0;l_s32AddrCount--)    {        printf("Server Local IP%d: %s",l_s32AddrCount,l_arrs8IpAddrList[l_s32AddrCount-1]);    } return 0;}
来源:https://caibiao-lee.blog.csdn.net/?type=blog





审核编辑:刘清

全文完 (责任编辑:admin)
相关文章
------分隔线----------------------------
栏目列表
推荐内容