日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言串口驱动程序

發布時間:2023/12/9 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言串口驱动程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

驅動層屏蔽了硬件細節,個人猜測,幾乎所有移植好的系統的串口,都可以用一樣的代碼來操作,至少2440和樹莓派是通用的。

分享代碼如下:

[cpp]?view plaincopy
  • #include?<sys/types.h>??
  • #include?<sys/stat.h>??
  • #include?<fcntl.h>??
  • #include?<termios.h>??
  • #include?<errno.h>??
  • #include?<ctype.h>??
  • #include?<stdio.h>??
  • #include?<stdlib.h>??
  • #include?<string.h>??
  • #include?<time.h>??
  • #include?<unistd.h>??
  • #include"pthread.h"??
  • #include?"serial.h"??
  • ??
  • ??
  • struct?serial_config?serialread;??
  • ??
  • static?int?serial_fd;??
  • ??
  • int?speed_arr[]?=?{B230400,?B115200,?B57600,?B38400,?B19200,?B9600,?B4800,?B2400,?B1200,?B300,??
  • ???????????B38400,?B19200,?B9600,?B4800,?B2400,?B1200,?B300};??
  • ??
  • int?name_arr[]?=?{230400,?115200,?57600,?38400,?19200,?9600,?4800,?2400,?1200,?300,??
  • ??????????38400,?19200,?9600,?4800,?2400,?1200,?300};??
  • ??
  • //-----------------------------------------------??
  • //打印配置文件serial.cfg的內容??
  • //-----------------------------------------------??
  • void?print_serialread()??
  • {??
  • ????printf("serialread.dev?is?%s\n",serialread.serial_dev);??
  • ????printf("serialread.speed?is?%d\n",serialread.serial_speed);??
  • ????printf("serialread.databits?is?%d\n",serialread.databits);??
  • ????printf("serialread.stopbits?is?%d\n",serialread.stopbits);??
  • ????printf("serialread.parity?is?%c\n",serialread.parity);??
  • }??
  • ??
  • //-----------------------------------------------??
  • //讀取serial.cfg文件并進行配置??
  • //-----------------------------------------------??
  • void?readserialcfg()??
  • {??
  • ????FILE?*serial_fp;??
  • ????char?j[10];??
  • ??????
  • ????printf("readserailcfg\n");??
  • ??
  • ????serial_fp?=?fopen("./serial.cfg","r");??
  • ????if(NULL?==?serial_fp)??
  • ????{??
  • ????????printf("can't?open?serial.cfg");??
  • ????}??
  • ????else??
  • ????{??
  • ????????fscanf(serial_fp,?"DEV=%s\n",?serialread.serial_dev);??
  • ??
  • ????????fscanf(serial_fp,?"SPEED=%s\n",?j);??
  • ????????serialread.serial_speed?=?atoi(j);??
  • ??
  • ????????fscanf(serial_fp,?"DATABITS=%s\n",?j);??
  • ????????serialread.databits?=?atoi(j);??
  • ??
  • ????????fscanf(serial_fp,?"STOPBITS=%s\n",?j);??
  • ????????serialread.stopbits?=?atoi(j);??
  • ??
  • ????????fscanf(serial_fp,?"PARITY=%s\n",?j);??
  • ????????serialread.parity?=?j[0];??
  • ????}??
  • ??
  • ????fclose(serial_fp);??
  • }??
  • ??
  • //-----------------------------------------------??
  • //設置波特率??
  • //-----------------------------------------------??
  • void?set_speed(int?fd)??
  • {??
  • ????int?i;??
  • ????int?status;??
  • ????struct?termios?Opt;??
  • ????struct?termios?oldOpt;??
  • ????tcgetattr(fd,?&oldOpt);??
  • //??printf("serialread.speed?is?%d\n",serialread.serial_speed);??
  • ????for(?i?=?0;?i?<?sizeof(speed_arr)/sizeof(int);?i++)??
  • ????{??
  • ????????if(serialread.serial_speed?==?name_arr[i])??
  • ????????{??
  • ????????????tcflush(fd,?TCIOFLUSH);??
  • ????????????cfsetispeed(&Opt,?speed_arr[i]);??
  • ????????????cfsetospeed(&Opt,?speed_arr[i]);??
  • ????????????status?=?tcsetattr(fd,?TCSANOW,?&Opt);??
  • ????????????if(status?!=?0)??
  • ????????????{??
  • ????????????????perror("tcsetattr?fd1");??
  • ????????????????return;??
  • ????????????}??
  • ????????????tcflush(fd,?TCIOFLUSH);??
  • ????????}??
  • ????}??
  • }??
  • ??
  • ??
  • //-----------------------------------------------??
  • //設置其他參數??
  • //-----------------------------------------------??
  • int??(int?fd)??
  • {??
  • ????struct?termios?options;??
  • ????struct?termios?oldoptions;??
  • ????if(tcgetattr(fd,?&oldoptions)?!=?0)??
  • ????{??
  • ????????perror("SetupSerial?1");??
  • ????????return(FALSE);??
  • ????}??
  • ??
  • ????options.c_cflag?|=?(CLOCAL|CREAD);??
  • ????options.c_cflag?&=~CSIZE;??
  • //??printf("serialread.databits?is?%d\n",serialread.databits);??
  • ????switch(serialread.databits)??
  • ????{??
  • ????????case?7:??
  • ????????????options.c_cflag?|=?CS7;??
  • ????????????break;??
  • ????????case?8:??
  • ????????????options.c_cflag?|=?CS8;??
  • ????????????break;??
  • ????????default:??
  • ????????????options.c_cflag?|=?CS8;??
  • ????????????fprintf(stderr,?"Unsupported?data?size\n");??
  • ????????????return(FALSE);??
  • ????}??
  • //??printf("serialread.parity?is?%c\n",serialread.parity);??
  • ????switch(serialread.parity)??
  • ????{??
  • ????????case?'n':??
  • ????????case?'N':??
  • ????????????options.c_cflag?&=?~PARENB;??
  • ????????????options.c_iflag?&=?~INPCK;??
  • ????????????break;??
  • ????????case?'o':??
  • ????????case?'O':??
  • ????????????options.c_cflag?|=?(PARODD?|?PARENB);??
  • ????????????options.c_iflag?|=?INPCK;??
  • ????????????break;??
  • ????????case?'e':??
  • ????????case?'E':??
  • ????????????options.c_cflag?|=?PARENB;??
  • ????????????options.c_cflag?&=?~PARODD;??
  • ????????????options.c_iflag?|=?INPCK;??
  • ????????????break;??
  • ????????default:??
  • ????????????options.c_cflag?&=?~PARENB;??
  • ????????????options.c_iflag?&=?~INPCK;??
  • ????????????fprintf(stderr,?"Unsupported?parity\n");??
  • ????????????return(FALSE);??
  • ????}??
  • //??printf("serialread.stopbits?is?%d\n",serialread.stopbits);??
  • ????switch(serialread.stopbits)??
  • ????{??
  • ????????case?1:??
  • ????????????options.c_cflag?&=?~CSTOPB;??
  • ????????????break;??
  • ????????case?2:??
  • ????????????options.c_cflag?|=?CSTOPB;??
  • ????????????break;??
  • ????????default:??
  • ????????????options.c_cflag?&=?~CSTOPB;??
  • ????????????fprintf(stderr,?"Unsupported?stop?bits\n");??
  • ????????????return(FALSE);??
  • ????}??
  • ????if(serialread.parity?!=?'n')??
  • ????????options.c_iflag?|=?INPCK;??
  • ????options.c_cc[VTIME]?=?0;????//150;??????????//15?seconds??
  • ????options.c_cc[VMIN]?=?0;??
  • #if?1??
  • ????options.c_iflag?|=?IGNPAR|ICRNL;??
  • ????options.c_oflag?|=?OPOST;???
  • ????options.c_iflag?&=?~(IXON|IXOFF|IXANY);???????????????????????
  • #endif??
  • ????tcflush(fd,?TCIFLUSH);??
  • ????if(tcsetattr(fd,?TCSANOW,?&options)?!=?0)??
  • ????{??
  • ????????perror("SetupSerial?3");??
  • ????????return(FALSE);??
  • ????}??
  • ????return(TRUE);??
  • }??
  • ??
  • //-----------------------------------------------??
  • //打開串口設備??
  • //-----------------------------------------------??
  • int?OpenDev(char?*Dev)??
  • {??
  • ????int?fd?=?open(Dev,?O_RDWR,?0);??
  • ????if(-1?==?fd)??
  • ????{??
  • ????????perror("Can't?Open?Serial?Port");??
  • ????????return?-1;??
  • ????}??
  • ????else??
  • ????????return?fd;??
  • }??
  • ??
  • //--------------------------------------------------??
  • //串口初始化??
  • //--------------------------------------------------??
  • void?serial_init()??
  • {??
  • ????char?*Dev;??
  • ??
  • ????int?i;??
  • ??
  • ????readserialcfg();??
  • ????//print_serialread();??
  • ????printf("init?serial\n");??
  • ??
  • ????Dev?=?serialread.serial_dev;??
  • ????//打開串口設備??
  • ????serial_fd?=?OpenDev(Dev);??
  • ??
  • ????if(serial_fd?>?0)??
  • ????????set_speed(serial_fd);???????//設置波特率??
  • ????else??
  • ????{??
  • ????????printf("Can't?Open?Serial?Port!\n");??
  • ????????exit(0);??
  • ????}??
  • ????//恢復串口未阻塞狀態??
  • ????if?(fcntl(serial_fd,?F_SETFL,?O_NONBLOCK)?<?0)??
  • ????{??
  • ????????printf("fcntl?failed!\n");??
  • ????????exit(0);??
  • ????}??
  • ????//檢查是否是終端設備??
  • #if?0???//如果屏蔽下面這段代碼,在串口輸入時不會有回顯的情況,調用下面這段代碼時會出現回顯現象。??
  • ????if(isatty(STDIN_FILENO)==0)??
  • ????{??
  • ????????printf("standard?input?is?not?a?terminal?device\n");??
  • ????}??
  • ????else??
  • ????????printf("isatty?success!\n");??
  • #endif??
  • ????//設置串口參數??
  • ????if(set_Parity(serial_fd)?==?FALSE)??
  • ????{??
  • ????????printf("Set?parity?Error\n");??
  • ????????exit(1);??
  • ????}??
  • ??
  • }??
  • ??
  • int?serial_write(char*?cmd,?int?count)??
  • {??
  • ????printf("serial?write?for?%d?bytes\n",count);??
  • ????return?write(serial_fd,cmd,count);??
  • }??
  • ??
  • void?serial_close()??
  • {??
  • ????printf("close?serial\n");??
  • ????close(serial_fd);??
  • }??
  • ??
  • /*?
  • void?serial_rw()?
  • {?
  • ????int?i;?
  • ????char?buff[512];?
  • ?????
  • ????int?nread,nwrite;?
  • ?
  • ?????char?buff2[]?=?"hello!\n";?
  • ????nwrite?=?write(serial_fd,buff2,sizeof(buff2));?
  • ????printf("nwrite=%d\n",nwrite);?
  • ????while(1)?
  • ????{?
  • ????????if((nread?=?read(serial_fd,buff,512))>0)?
  • ????????{??
  • ????????????buff[nread]?=?'\0';?
  • #if?1???//調用這段代碼可以實現回顯,如果配合上面的回顯,就會出現回顯兩次的情況。?
  • ????????????write(serial_fd,buff,nread);?
  • #endif?
  • ????????????printf("recv:%d\n",nread);?
  • #if?1?
  • ????????????for(i=0;i<nread;i++)?
  • ????????????{?
  • ????????????????printf("%c",buff[i]);?
  • ????????????}?
  • ????????????printf("\n");?
  • #else?
  • ????????????printf("%s",buff);?
  • ????????????printf("\n");?
  • #endif?
  • ????????}?
  • ????}?
  • ??
  • ?
  • ?
  • }?
  • */??
  • /*?
  • int?main(int?argc,?char?**argv)?
  • {?
  • ????serial_init();?
  • ?
  • ????char?cmd[]={0xfc,0x01,0x01,0x02,0x01,0x00,0x03,0x01,0xcf};?
  • ????write(serial_fd,cmd,sizeof(cmd));?
  • ????close(serial_fd);?
  • ?????
  • ????return?0;?
  • //??close(serialread.serial_dev);?
  • //??serial_test(telnum,?telmoney);?
  • }?
  • */??

  • 當然,還需要對應的頭文件:

    [cpp]?view plaincopy
  • #define?FALSE???????0??
  • #define?TRUE????????1??
  • ??
  • #define?WORDLEN?32??
  • ??
  • struct?serial_config??
  • {??
  • ????unsigned?char?serial_dev[WORDLEN];??
  • ????unsigned?int?serial_speed;??
  • ????unsigned?char?databits;??
  • ????unsigned?char?stopbits;??
  • ????unsigned?char?parity;??
  • };??
  • ??
  • void?serial_init();??
  • int?serial_write(char*?cmd,?int?count);??
  • void?serial_close();??

  • 以及分離出來的配置文件:

    [cpp]?view plaincopy
  • DEV=/dev/ttyAMA0??
  • SPEED=9600??
  • DATABITS=8??
  • STOPBITS=1??
  • PARITY=N ?
  • 總結

    以上是生活随笔為你收集整理的C语言串口驱动程序的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。