生活随笔
收集整理的這篇文章主要介紹了
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};?? ?? ?? ?? ?? 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);?? }?? ?? ?? ?? ?? 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);?? ?? ????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;?? ?? ????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);?? ????}?? ?? ????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);?? ????}?? ?? ????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;?????? ????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();?? ?????? ????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);?? }?? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
當然,還需要對應的頭文件:
[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语言串口驱动程序的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。