读串口linux
1. linux系统下,如何写读串口的程序要注意那些
去 google 下吧
概括来说,打开串口设备,读串口数据到你缓冲区,写数据到串口设备
2. linux怎么用C程读取XBee接收到的串口数据
太专业鸟
3. 在linux系统下怎么读取串口服务器的实时数据
Linux串口读写:
#include <stdio.h> /*标准输入输出定义*/
#include <stdlib.h> /*标准函数库定义*/
#include <unistd.h> /*Unix 标准函数定义*/
#include <sys/types.h>
#include <sys/stat.h>
#include "string.h"
#include <fcntl.h> /*文件控制定义*/
#include <termios.h> /*PPSIX 终端控制定义*/
#include <errno.h> /*错误号定义*/
#define FALSE -1
#define TRUE 0
/*********************************************************************/
int OpenDev(char *Dev)
{
int fd = open( Dev, O_RDWR | O_NOCTTY ); //| O_NOCTTY | O_NDELAY
if (-1 == fd)
{
perror("Can't Open Serial Port");
return -1;
}
else
return fd;
}
/**
*@brief 设置串口通信速率
*@param fd 类型 int 打开串口的文件句柄
*@param speed 类型 int 串口速度
*@return void
*/
int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,
B38400, B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400,
19200, 9600, 4800, 2400, 1200, 300, };
void set_speed(int fd, int speed)
{
int i;
int status;
struct termios Opt;
tcgetattr(fd, &Opt);
for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++) {
if (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);
}
}
}
/**
*@brief 设置串口数据位,停止位和效验位
*@param fd 类型 int 打开的串口文件句柄
*@param databits 类型 int 数据位 取值 为 7 或者8
*@param stopbits 类型 int 停止位 取值为 1 或者2
*@param parity 类型 int 效验类型 取值为N,E,O,,S
*/
int set_Parity(int fd,int databits,int stopbits,int parity)
{
struct termios options;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input*/
options.c_oflag &= ~OPOST; /*Output*/
if ( tcgetattr( fd,&options) != 0) {
perror("SetupSerial 1");
return(FALSE);
}
options.c_cflag &= ~CSIZE;
switch (databits) /*设置数据位数*/
{
case 7:
options.c_cflag |= CS7;
break;
case 8:
options.c_cflag |= CS8;
break;
default:
fprintf(stderr,"Unsupported data size/n"); return (FALSE);
}
switch (parity)
{
case 'n':
case 'N':
options.c_cflag &= ~PARENB; /* Clear parity enable */
options.c_iflag &= ~INPCK; /* Enable parity checking */
break;
case 'o':
case 'O':
options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/
options.c_iflag |= INPCK; /* Disnable parity checking */
break;
case 'e':
case 'E':
options.c_cflag |= PARENB; /* Enable parity */
options.c_cflag &= ~PARODD; /* 转换为偶效验*/
options.c_iflag |= INPCK; /* Disnable parity checking */
break;
case 'S':
case 's': /*as no parity*/
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;break;
default:
fprintf(stderr,"Unsupported parity/n");
return (FALSE);
}
/* 设置停止位*/
switch (stopbits)
{
case 1:
options.c_cflag &= ~CSTOPB;
break;
case 2:
options.c_cflag |= CSTOPB;
break;
default:
fprintf(stderr,"Unsupported stop bits/n");
return (FALSE);
}
/* Set input parity option */
if (parity != 'n')
options.c_iflag |= INPCK;
tcflush(fd,TCIFLUSH);
options.c_cc[VTIME] = 150; /* 设置超时15 seconds*/
options.c_cc[VMIN] = 0; /* Update the options and do it NOW */
if (tcsetattr(fd,TCSANOW,&options) != 0)
{
perror("SetupSerial 3");
return (FALSE);
}
return (TRUE);
}
int main(int argc, char **argv)
{
int fd;
int nread;
char buff[512];
char *dev = "/dev/ttyS0"; //串口二
fd = OpenDev(dev);
set_speed(fd,4800);
if (set_Parity(fd,8,1,'N') == FALSE)
{
printf("Set Parity Error/n");
exit (0);
}
int i;
i = getchar();
if ( i == '1')
{
while (1) //循环读取数据
{
while((nread = read(fd, buff, 512))>0)
{
printf("/nLen %d/n",nread);
buff[nread+1] = '/0';
printf( "/n%s", buff);
}
}
}
if ( i == '2')
{
while (1) //循环写入数据
{
gets(buff);
printf("------buff--->%s<--------/n",buff);
int num = strlen(buff);
printf("--------num---->%d<--------------/n",num);
if ( num > 0)
{
printf("Wirte num not NULL./r/n");
nread = write(fd, buff ,num);
if(nread == -1)
{
printf("Wirte sbuf error./n");
}
printf("--nread---->%d<-----------/n",nread);
}
}
}
close(fd);
//exit (0);
}
4. linux串口读写的问题
i g i e j e a u w b i g g
承接各类停车场IC卡的制加密与复制
s v r r s s s i g n x c u
类型:门禁卡加密复制,停车卡加密复制,电梯卡加密复制,桑拿房卡加密复制,物业卡加密复制等等
l i b g c h c w b s l j j
提供M1,S50。S70卡解密,复制,限合法:另解密技术转让1200元(包括正版解密工具一套免费升级)包教会。QQ:1 8 2 j a 330 now 8147 bg
a c p q q q r j h o t w s
5. Linux中串口read怎样阻塞的方式读入数据
Linux中串口read怎样阻塞的方式读入数据C/C++ code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
pthread_mutex_lock(&ptty->mt);
ret = read(ptty->fd, pbuf, 1); //由于read并不阻塞 要监听随时可能来数据的串口 得不停的循环的查看 效率好低
if(ret < 0)
{
//串口没有数据进来
}
else
{
//相关处理
}
/*
怎样加以控制使得,或使用什么函数
readfunction(ptty->fd, pbuf, ......);//使得这儿没有串口数据时阻塞,有串口数据了就读到
//避免不停的循环+sleep() 耗费ARM板资源,而且有时还漏读
//有的说用什么fcntl,ioctl 这两不太懂,希望可以解释清楚点
*/
pthread_mutex_unlock(&ptty->mt);
6. linux下串口通信,第一次可以读数据,然后往串口写数据,再读数据却读不出,求帮助
A<==RS232==>B,A和B通信,通过RS232协议,读数据的话,是读对方发来的数据;写数据的话,是给对方写数据。所以,要用个while死循环,始终监听串口是否读到数据。
7. linux串口读取问题
首先你确定你那串口是否有东西可读? 就是你上面说的“一个文件不停的写数据到串口”!你可以先不这样读取,你可以在终端上用cat试试是否有数据可读:cat /dev/ttyS0
如果有的话,那你就检查串口设置是否正确,如波特率,数据位,停止位,校验位等!
最后就是你读取的函数了,看看先不要用printf打印字符串了,先看看十六进制是否有,然后再看字符等!
就是以上一些,你还可以参考Linux下串口文档,网络上很多的……
8. linux下串口读写问题挂死
这样写肯定会写死的啊..写(也就是串口发送数据)实际应用不会这么频繁的.楼主可以在写后加上一个sleep(1);这样就不会写死了..
高并发读写这样设计也是错误的应该用队列来处理..
9. 关于linux下QT中读写串口的问题
一、程序设计的基础,例如:基本的编程语言基础,至少对数据类型、程序的结构及流程控制等最基本的内容要相当清楚!另外有不少同学都问到数据结构的基础,我一直认为数据结构和算法的学习是帮助形成程序设计逻辑思维的很好训练方式,对于程序员的长期专业素养的提高一定有好处,所以建议即使已经在嵌入式行业中工作之后也应该多补充一些相关的知识。许多在学校没有学过数据结构的同学往往认为这部分非常枯燥、难学。而实际上如果你能明白研究计算机存储和数据组织方式的意义,就一定能够充分体会到数据结构的价值和魅力。
二、操作系统工作原理,这部分往往是非计算机专业的同学在学校时没有接触过的。而由于嵌入式软件设计相关的多任务环境、模块间的同步与通信协同、驱动设计等往往都需要有对操作系统工作机制的了解和掌握作为基础,因此建议没有系统学习过的同学,找一本相关的操作系统工作原理书籍认真看一下。
三、基本的硬件基础,由于嵌入式Linux开发往往是ARM+Linux路线,所以为了能够在后续培训过程中很好地掌握主流嵌入式微处理器的结构与原理(例如:ARM9),就需要对硬件工作原理有初步的了解和掌握,建议看一下诸如计算机组成原理、体系结构等相关的专业书籍。
有没有基础知识及基础知识的多少在很大程度上影响着你能否学习嵌入式linux及学习进度,因此,各个培训机构在学员入学前读会对其进行基础知识考查,像其中的东方赛富嵌入式学院对这一块更加看重,因为他们是保障真正100%就业,对学员入学的要求更加严格!