linux下串口编程的个人心得

来源:本站
导读:目前正在解读《linux下串口编程的个人心得》的相关信息,《linux下串口编程的个人心得》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《linux下串口编程的个人心得》的详细说明。
简介:我刚刚完成了一个串口的项目,有一点收获,就说说着段时间的体会吧!

一开始在网上找资料,最多是《Linux Serial HOWTO 中譯版,

后来发现,其实串口编程的实质就是多串口属性的设置。

而属性也就下面这么几个:

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.

当把这篇文章看完之后,基本可以解决串口的设置问题了。

下面的是我的程序,一个串口读取,往mysql数据库写数据的程序:

#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 "mysql.h"

#define BAUDRATE B9600

#define DEVICE "/dev/ttyS0"

#define _POSIX_SOURCE 1

#define FALSE 0

#define TRUE 1

int insertdb(int d1, int d2, int d3, int d4) {

MYSQL connect;

int res, no1, no2, sd1, sd2;

char *query = "INSERT INTO mydata ( stime, sno1, sno2, sdata1, sdata2 ) VALUES ( '%s', %d, %d, %x, %x)";

char *sql, *st1;

struct tm *ptr;

time_t lt;

no1 = d1;

no2 = d2;

sd1 = d3;

sd2 = d4;

lt = time(NULL);

ptr = localtime(&lt);

st1 = (char *)asctime(ptr);

st1[strlen(st1) -1 ] = '/0';

sql = (char *)malloc(255*sizeof(char));

sprintf(sql, query, st1, no1, no2, sd1, sd2);

/* debug here

printf("%c : ", st1[strlen(st1)]);

printf("%s : %d :",sql, strlen(st1));

return EXIT_SUCCESS;

*/

mysql_init(&connect);

if(mysql_real_connect(&connect, "localhost", "root", "root", "mytest", 0, NULL, 0)) {

printf("connect success!/n");

res = mysql_query(&connect, sql);

if(!res) {

printf("insert success!/n");

} else {

fprintf(stderr, "insert error %d: %s/n", mysql_errno(&connect), mysql_error(&connect));

return EXIT_FAILURE;

}

mysql_close(&connect);

} else {

fprintf(stderr, "connect fail!/n");

return EXIT_FAILURE;

}

return EXIT_SUCCESS;

}

int main(void) {

int fd, res_w, res_r, i, j, k;

struct termios oldtio,newtio;

char inbuf[255];

char cbuf[4];

int buf[4];

res_w = 0;

res_r = 0;

fd = open(DEVICE, O_RDWR | O_NOCTTY ); // | O_NDELAY);

if(fd < 0) {

perror(DEVICE);

exit(-1);

}

tcgetattr(fd, &oldtio);

bzero(&newtio,sizeof(struct termios));

newtio.c_cflag|= (CLOCAL | CREAD);

newtio.c_cflag|=BAUDRATE;

newtio.c_cflag&=~CSTOPB;

newtio.c_cflag&=~PARENB;

newtio.c_cflag&=~CSIZE;

newtio.c_cflag|=CS8;

newtio.c_cflag&=~CRTSCTS;

newtio.c_lflag=0;

newtio.c_oflag=0;

newtio.c_cc[VMIN]=4;

newtio.c_cc[VTIME]=0;

newtio.c_iflag&=~(IXON|IXOFF|IXANY);

cfsetispeed(&newtio, BAUDRATE);

cfsetospeed(&newtio, BAUDRATE);

tcsetattr(fd, TCSANOW, &newtio);

tcflush(fd, TCIFLUSH);

cbuf[0] = 0x00;

//cbuf[1] = 0x00;

j = 0;

for(k = 0; k < 4; k++) {

switch (j) {

case 0:

default:

cbuf[1] = 0x00;

j = 2;

break;

case 2:

cbuf[1] = 0x02;

j = 0;

break;

}

res_w = write(fd, cbuf, 2);

/* debug here

printf("cbuf : %x %x /n", cbuf[0], cbuf[1]);

printf("buf : %x : %x : %x : %x /n", inbuf[0], inbuf[1], inbuf[2], inbuf[3]);

*/

res_r = read(fd, &inbuf, 255);

if(res_r != -1) {

for(i = 0; i < res_r; i++) {

buf[i] = (int)inbuf[i];

buf[i] = buf[i] & 0xff;

//printf(" %x ", buf[i]);

}

printf("/n");

if(insertdb(buf[0], buf[1], buf[2], buf[3]))

printf("insert into db success!");

}

else {

perror("read fail");

exit(-1);

}// if end here

}// for end here

tcsetattr(fd, TCSANOW, &oldtio);

close(fd);

exit(0);

} // main end here

提醒:《linux下串口编程的个人心得》最后刷新时间 2024-03-14 01:05:15,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《linux下串口编程的个人心得》该内容的真实性请自行鉴别。