Linux 下串口編程心得

來源:互聯網
上載者:User

Linux 下串口編程心得

        我剛剛完成了一個串口的項目,有一點收穫,就說說這段時間的體會吧!

        一開始在網上找資料,最多是《Linux Serial HOWTO 中譯版》,瀏覽地址:http://linux.cis.nctu.edu.tw/chinese/how-to/Serial-HOWTO.html。以及眾多這個版本的摘選,內容是大同小異的。

        後來發現,其實串口編程的實質就是多串口屬性的設定。
        而屬性也就下面這麼幾個:
c_cflag Control options
c_lflag Line options
c_iflag Input options
c_oflag Output options
c_cc Control characters
c_ispeed Input baud (new interface)
c_ospeed Output baud (new interface)
        關鍵是理解有那些屬性參數可以設定以及是什麼意思。

        繼續找資料。發現下面的經典文章,可以說基本上所有的串口編程的文章都或多或少的參考了這篇文章,《Serial Programming Guide for POSIX Operating Systems》是一定要看的,我讀的是 5th Edition, 3rd Revision - Updated March 11, 2003,:http://www.easysw.com/~mike/serial/index.html 。

        當把這篇文章看完之後,基本可以解決串口的設定問題了。不過這是一個英文的版本,本人打算在暑假裡把他翻譯為中文版本。

        關於具體的例子:
        http://www.comptechdoc.org/os/linux/programming/c/linux_pgcserial.html 不錯,很詳細,不過比較複雜。
        中文的《Linux Serial HOWTO 中譯版》上面就有不少,也很值得參考。

        下面的是我的程式,一個串口讀取,往 mysql 資料庫寫資料的程式:
#include <sys/types.h><br />#include <sys/stat.h><br />#include <fcntl.h><br />#include <termios.h><br />#include <errno.h><br />#include <ctype.h><br />#include <stdio.h><br />#include <stdlib.h><br />#include <string.h><br />#include <time.h></p><p>#include "mysql.h"</p><p>#define BAUDRATE B9600<br />#define DEVICE "/dev/ttyS0"<br />#define _POSIX_SOURCE 1<br />#define FALSE 0<br />#define TRUE 1</p><p>int insertdb(int d1, int d2, int d3, int d4) {<br /> MYSQL connect;<br /> int res, no1, no2, sd1, sd2;<br /> char *query = "INSERT INTO mydata ( stime, sno1, sno2, sdata1, sdata2 ) VALUES ( '%s', %d, %d, %x, %x)";<br /> char *sql, *st1;<br /> struct tm *ptr;<br /> time_t lt;</p><p> no1 = d1;<br /> no2 = d2;<br /> sd1 = d3;<br /> sd2 = d4;<br /> lt = time(NULL);<br /> ptr = localtime(<);<br /> st1 = (char *)asctime(ptr);<br /> st1[strlen(st1) -1 ] = '/0';<br /> sql = (char *)malloc(255*sizeof(char));<br /> sprintf(sql, query, st1, no1, no2, sd1, sd2);</p><p>/* debug here<br /> printf("%c : ", st1[strlen(st1)]);<br /> printf("%s : %d :",sql, strlen(st1));<br /> return EXIT_SUCCESS;<br />*/</p><p> mysql_init(&connect);</p><p> if(mysql_real_connect(&connect, "localhost", "root", "root", "mytest", 0, NULL, 0)) {<br /> printf("connect success!/n");</p><p> res = mysql_query(&connect, sql);</p><p> if(!res) {<br /> printf("insert success!/n");<br /> } else {<br /> fprintf(stderr, "insert error %d: %s/n", mysql_errno(&connect), mysql_error(&connect));<br /> return EXIT_FAILURE;<br /> }</p><p> mysql_close(&connect);<br /> } else {<br /> fprintf(stderr, "connect fail!/n");<br /> return EXIT_FAILURE;<br /> }</p><p> return EXIT_SUCCESS;<br />}</p><p>int main(void) {<br /> int fd, res_w, res_r, i, j, k;<br /> struct termios oldtio,newtio;<br /> char inbuf[255];<br /> char cbuf[4];<br /> int buf[4];</p><p> res_w = 0;<br /> res_r = 0;</p><p> fd = open(DEVICE, O_RDWR | O_NOCTTY ); // | O_NDELAY);<br /> if(fd < 0) {<br /> perror(DEVICE);<br /> exit(-1);<br /> }</p><p> tcgetattr(fd, &oldtio);</p><p>bzero(&newtio,sizeof(struct termios));</p><p>newtio.c_cflag|= (CLOCAL | CREAD);<br />newtio.c_cflag|=BAUDRATE;<br />newtio.c_cflag&=~CSTOPB;<br />newtio.c_cflag&=~PARENB;<br />newtio.c_cflag&=~CSIZE;<br />newtio.c_cflag|=CS8;<br />newtio.c_cflag&=~CRTSCTS;</p><p>newtio.c_lflag=0;</p><p>newtio.c_oflag=0;</p><p>newtio.c_cc[VMIN]=4;<br />newtio.c_cc[VTIME]=0;</p><p>newtio.c_iflag&=~(IXON|IXOFF|IXANY);</p><p>cfsetispeed(&newtio, BAUDRATE);<br />cfsetospeed(&newtio, BAUDRATE);</p><p>tcsetattr(fd, TCSANOW, &newtio);</p><p>tcflush(fd, TCIFLUSH);</p><p> cbuf[0] = 0x00;<br />// cbuf[1] = 0x00;</p><p> j = 0;</p><p>for(k = 0; k < 4; k++) {<br /> switch (j) {<br /> case 0:<br /> default:<br /> cbuf[1] = 0x00;<br /> j = 2;<br /> break;<br /> case 2:<br /> cbuf[1] = 0x02;<br /> j = 0;<br /> break;<br /> }</p><p> res_w = write(fd, cbuf, 2);</p><p>/* debug here<br />printf("cbuf : %x %x /n", cbuf[0], cbuf[1]);<br />printf("buf : %x : %x : %x : %x /n", inbuf[0], inbuf[1], inbuf[2], inbuf[3]);<br />*/<br /> res_r = read(fd, &inbuf, 255);</p><p> if(res_r != -1) {<br /> for(i = 0; i < res_r; i++) {<br /> buf[i] = (int)inbuf[i];<br /> buf[i] = buf[i] & 0xff;<br /> // printf(" %x ", buf[i]);<br /> }<br /> printf("/n");<br /> if(insertdb(buf[0], buf[1], buf[2], buf[3]))<br /> printf("insert into db success!");<br /> }<br /> else {<br /> perror("read fail");<br /> exit(-1);<br /> }// if end here<br />}// for end here</p><p> tcsetattr(fd, TCSANOW, &oldtio);</p><p> close(fd);<br /> exit(0);<br />} // main end here

 

原文連結:http://space.itpub.net/22893636/viewspace-662999

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.