linux关闭串口
1. 串口设置问题,在linux系统中
如果要设置某个选项,那么就使用"|="运算,如果关闭某个选项就使用"&="和"~"运算。
当你单个赋值的时候,首先要把当前的设置获取到,然后再进行或运算。
不知道你的是不是这个问题,你也没有把代码搞过来
2. linux怎么锁住串口,禁止其他程序使用,即禁止其他程序进行读写操作,即使是root用户也不允许读
应该是没有这样的办法的。
linux系统基本上不会禁止root的权限,即使你想办法禁止了,也有办法打开,除非那不是真正的root。
你应该换一个思路来解决你的问题。比如除了你的程序,没有其他程序运行在这台电脑上,没有其他用户有权访问这台电脑,不就解决了吗?
3. linux串口测试
串行端口是系统资源的一部分,其本质是作为CPU和串行设备间的编码转换器。当数据从 CPU经过串行端口发送出去时,字节数据转换为串行的位(Bit); 接收数据时,串行的位被转换为字节数据。应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(即打开串口),通信完成后再释放资源(即关闭串口)。
所以是要经过CPU的
4. linux中有没有替代windows串口编程中SetCommBreak()与ClearCommBreak()
(一)Windows API串口通信编程概述
Windows环境下的串口编程与DOS环境下的串口编程有很大不同。Windows环境下的编程的最大特征之一就是设备无关性,它通过设备驱动程序将Windows应用程序同不同的外部设备隔离。Windows封装了Windows的通信机制,这种方式称为通信API,Windows程序可以利用Windows通信API进行编程,不用对硬件直接进行操作。这种体系被称为Windows开放式服务体系(WOSA,Windows Open Services Architectures)。
早期的Windows3.x与Windows 9x/NT/2000的通信API有很大不同,在16位的串行通信程序中,一般使用16位的Windows API通信函数。为使大家对串口通信有一全面的理解,下面简单介绍一下16位的Windows API通信函数:
(1) 打开和关闭串口
OpenComm()打开串口资源,并指定输入、输出缓冲区的大小(以字节计);
CloseComm()关闭串口;
例:
int idComDev;
idComdev=OpenComm(“COM1”,1024,512);
CloseComm(idComDev);
(2) 初始化串口
BuildCommDCB()、setCommState()填写设备控制块DCB,然后对已打开的串口进行参数配置,例:
DCB dcb;
BuildCommDCB(〝COM1:2400,n,8,1〞,&dcb);
SetCommState(&dcb);
(3) 对串口进行读写
ReadComm、WriteComm()对串口进行读写操作,即数据的接收和发送。例:
char *m_pReceive; int count;
ReadComm(idComDev,m_pReceive,count);
Char wr[30]; int count2;
WriteComm(idComDev,wr,count2);
通过对以上的描述我们可以看出,16位以下的串口通信程序最大的特点就在于串口等外部设备的操作有自己特有的API函数。
Windows 9x/NT/2000中的API一般都支持32位的操作,因此又称为Win32API。为了在上述系统中实现串行数据传送,可以使用Win32通信API。Win32通信API基本上是一个串行端口API,不是很适合于局域网(LAN)通信。虽然在线路上发送数据之前,LAN通常将数据位串行化,这和窗口或调制解调器发送数据之前所作的工作一模一样,但局域网使用的线路的位数通常比串口少,而且还使用与串口协议很少有类似之处的访问、路由、安全性和纠错协议。局域网通信所需要的协议层使得Win32通信API对于这些应用来说很不理想。因此,在网络通信和连接方面,TCP/IP协议要比Win32通信API更适合一些。
Windows操作系统是一个可抢占式的操作系统,所以Windows应用程序常常有被别的程序抢占时间片的可能,因此Win32通信API也不能用于实时通信。实时通信的质量与时间密切相关。例如,数字化音频数据是实时数据,因为话音的质量依赖于播放它的速率。在录制音频时,它就以某个速度被数字化了,该速度就是人们所熟知的采样速率。声音必须以相同的采样率重放,否则听起来就会太慢或太快。实际中的视频播放,也不是实时播放,那仅仅是存放在缓冲中的那部分数据。因此,不需要许多协议层的交互式、非实时的通信可以采用Win32通信API来实现。Win32通信API把串口操作(以及并口等)和文件操作统一起来了,使用类似的操作来实现。
(二) Windows串口通信相关API函数
“工欲善其事,必先利其器”,这一节将从使用的角度出发,对和串口通信相关的32位的Windows API函数进行介绍,力图使你们对其有个全面、准确的认识。
2.1 打开和关闭串口
1. 打开串口
在32位的Windows系统中,串口和其它通信设备是作为文件处理的。串口的打开、关闭、读取和写入所用的函数与操作文件的函数完全一致。
通信会话以调用CreateFile()开始。CreateFile()为读访问、写访问或读写访问“打开”串口。按照Windows的通常做法,CreateFile()返回一个句柄,随后在打开的端口的操作中使用CreateFile()函数非常复杂,复杂性的原因之一是它是通用的。可以使用CreateFile打开已存在的文件,创建新文件和打开根本就不是文件的设备,例如串口、并口和调制解调器。CreateFile()函数声明如下:
HANDLE CreateFile(
LPCTSTR lpszName,
DWORD fdwAccess,
DWORD fdwShareMode,
LPSECURITY_ATTRIBUTES lpsa,
DWORD fdwCreate,
DWORD fdwAttrsAndFlags,
HANDLE hTemplateFile
)
CreateFile函数中的参数解释如下:
·lpszName:指定要打开的串口逻辑名,用字符串表示,如“COM1”和“COM2”分别表示串口1和串口2。
·fdwAccess:用来指定串口访问的类型。与文件一样,串口也是可以被打开以供读取、写入或者两者兼有。
GENERIC_READ位读取访问打开端口,GENERIC_READ位写访问打开端口。这两个常数定义如下:
const GENERIC_READ = 0x80000000h;
const GENERIC_WRITE = 0x40000000h;
用户可以用逻辑操作将这两个标识符连接起来,为读/写访问权限打开端口。因为大部分串口通信都是双向的,因此常常在设置中将两个标识符连接起来使用。如:
fdwAccess = GENERIC_READ | GENERIC_WRITE;
·fdwShareMode:指定该端口的共享属性。该参数是为那些由许多应用程序共享的文件提供的。对于不能共享的串口,它必须设置为0。这就是文件与通信设备之间的主要差异之一。如果在当前的应用程序调用CreateFile()时,另一个应用程序已经打开了串口,该函数就会返回错误代码,原因是两个应用程序不能共享一个端口。然而,同一个应用程序的多个线程可以共享由CreateFile()返回的端口句柄,并且根据安全性属性设置,该句柄可以被打开端口的应用程序的子程序所继承。
·Ipsa:引用安全性属性结构(SECURITY_ARRTIBUTES),该结构定义了一些属性,例如通信句柄如何被打开端口的应用程序的子程序所继承。将该参数设置为NULL将为该端口分配缺省的安全性属性。子应用程序所继承的缺省属性是该端口不能被继承的。
安全属性结构SECURITY_ARRTIBUTES结构声明如下:
typedef struct_SECURITY_ARRTIBUTE {
DWORD nLength;
LPVOID lpSecurityDescriptor;
BOOL bInheritHandle;
} SECURITY_ARRTIBUTE;
SECURITY_ARRTIBUTES结构成员nLength指明该结构的长度,lpSecurityDescriptor指向一个安全描述字符,bInheritHandle表明句柄是否能被继承。
·fdwCreate:指定如果CreateFile()正在被已有的文件调用时应采取的动作。因为串口总是存在,fdwCreate必须设置成OPEN_EXISTING。该标志告诉Windows不用企图创建新端口,而是打开已经存在的端口。OPEN_EXISTING常数定义为:
const OPEN_EXISTING = 3;
·fdwAttrsAndFlags:描述了端口的各种属性。对于文件来说,有可能具有很多属性,但对于串口,唯一有意义的设置是FILE_FLAG_OVERLAPPED。当创建时指定该设置,端口I/O可以在后台进行(后台I/O也叫异步I/O)。FILE_FLAG_OVERLAPPED常数定义如下:
const FILE_FLAG_OVERLAPPED = 0x40000000h
·hTemplateFile:指向模板文件的句柄,当端口处于打开状态时,不使用该参数,因而必须置成0。
调用CreateFile()函数打开COM1串口操作的例子如下所示:
HANDLE hCom;
DWORD dwError;
hCom=CreateFile(“COM1”, // 文件名
GENERIC_READ | GENERIC_WRITE, // 允许读和写
0, // 独占方式
NULL,
OPEN_EXISTING, // 打开而不是创建
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, // 重叠方式
NULL
);
if(hCom = = INVALID_HANDLE_VALUE)
{
dwError=GetLastError(); // 处理错误
}
一旦端口处于打开状态,就可以分配一个发送缓冲区和接收缓冲区,并且通过调用SetupComm()实现其它初始化工作。也可以不调用SetupComm()函数,Windows系统也会分配缺省的发送和接收缓冲区,并且初始化端口。但为了保证缓冲区的大小与实际需要的一致,最好还是调用该函数。SetupComm()函数声明如下:
BOOL SetupComm(
HANDLE hFile, // 通信设备句柄
DWORD dwInQueue, // 输入缓冲区大小
DWORD dwOutQueue // 输出缓冲区大小
);
SetupComm()函数中各项含义说明如下:
·hFile: 由GreatFile()返回的指向已打开端口的句柄。
·dwInQueue和dwOutQueue: 接收缓冲区的大小和发送缓冲区的大小。这两个定义并非是实际的缓冲区的大小,指定的大小仅仅是“推荐的”大小,而Windows可以随意分配任意大小的缓冲区。Windows设备驱动程序可以获得这两个数据,并不直接分配大小,而使用来优化性能和避免缓冲区超限。
注意:当使用CreateFile()函数打开串口时:为实现调制解调器的排他性访问,共享标识必须设为零;创建标识必须设为OPEN_EXISTING;模板句柄必须置为空。
2. 关闭串口
关闭串口比打开串口简单得多,只需要调用CloseHandle()函数关闭由CreateHandle()函数返回得句柄即可。
CloseHandle函数声明如下:
BOOL CloseHandle(
HANDLE hObject // 需关闭的设备句柄
);
使用串口时一般要关闭它,如果忘记关闭串口,串口就会始终处于打开状态,其它应用程序就不能打开并使用串口了。
附上出处链接:http://blog.csdn.net/nocodelife/article/details/8594073
5. Linux串口怎么清空
tcflush函数清除串口输入缓存(终端驱动已接到,但用户尚未读取)或串口输出缓存(用户已经写如缓存,但尚未发送)。
函数原型:
int tcflush(int filedes,int quene)
参数解释
filedes: 描述符。
quene取值及含义:
*TCIFLUSH 清除输入队列
*TCOFLUSH 清除输出队列
*TCIOFLUSH 清除输入、输出队列
举例:tcflush(fd,TCIOFLUSH);
6. Linux下对串口操作的方法
和文件一样,open /dev/ttyS0就是串口1 然后设置波特率,停止位 奇偶校验那些 ,之后read write就可以了 头文件是<termios.h>
7. Linux怎么把串口设置
简单的运行 dmesg 命令
$ dmesg | grep tty
输出:
[ 37.531286] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[ 37.531841] 00:0b: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[ 37.532138] 0000:04:00.3: ttyS1 at I/O 0x1020 (irq = 18) is a 16550A
setserial 命令
setserial 是一个程序用于设定并/或报告某个串口关联的配置信息。该信息包括串口用到的I/O 端口和中断号,以及Break键是否应被解释为Secure Attention Key 等等。 仅仅是输出如下的命令:
$ setserial -g /dev/ttyS[0123]
输出:
/dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4
/dev/ttyS1, UART: 16550A, Port: 0x1020, IRQ: 18
/dev/ttyS2, UART: unknown, Port: 0x03e8, IRQ: 4
/dev/ttyS3, UART: unknown, Port: 0x02e8, IRQ: 3
带-g选项的setserial帮助找到你的Linux板子上的物理串口。
Linux 串口控制台程序
一旦串口被确定了,你就能使用许多的工具来配置Linux板子:
minicom- 用于控制modem和连接到mp 设备的最好的串口通信程序。
wvidial or other GUI dial up networking program - 一个内建智能PPP 拨号器。
getty / agetty - agetty 打开一个 tty 端口, 提示登录名称并调用 /bin/login 命令。
grub / lilo configuration - 配置串口为系统控制台。
8. 如何禁止linux串口输出调试信息,作为通讯串口。
netstat -tln 开放服务的同时,端口就开启了。 比如你开启了ssh服务,那么22端口就自动开启le
9. linux启动的log能关掉或者不在串口显示吗
1.准备
串口线一条、手机一个
2.步骤
1将串口线插入电脑USB口,开启另一个终端查看串口设备名,输入下面命令:
dmesg
2找到最下面一行,尾部即是串口设备名称,我这里叫做“ttyUSB0”
3然后安装串口抓取软件,进入Ubuntu软件中心,搜索CuteCom,点击安装即可。
4运行CuteCom,需要root权限,所以通过终端来进行
sudo cutecom
打开后的界面如下:
5在上图位置1,填入/dev/ttyUSB0,位置2选最大参数921600
6准备工作就完毕了,点击Open device按钮,工具开始等待设备接入
7将手机连上串口线,点击开机按钮,位置3中就会将串口log打印出来
8如果需要保存,可以勾选位置4,点击后面的“…”按钮可以选择存储路径。也可以直接在位置3通过复制粘贴操作进行。
3.注意事项
有些手机的串口log是没有打开的,那么就无法抓取得到。串口log一般都在开机后不再输出(影响性能),因此常用于分析开机log。
10. LINUX和开发版 串口程序编写问题
while (STOP==FALSE)
{
//在此处补充填写代码?实现读取串口数据、并将数据在标准终端上写出来
if(read(fd, data, ENDMINITERM)==0)
return data;
}
while (STOP==FALSE)
{
c++;
c %= 255;
//在此处补充填写代码?实现写入串口数据
if(write(fd, data, ENDMINITERM) < 0)
exit(1);
usleep(1000000);
}
//在此处补充填写代码?实现打开串口1的功能
fd = open(COM1,O_RDWR);
if(fd < 0)
exit(1);
//在此处补充填写代码?实现创建键盘监控、接收、发送三个线程,并等待线程结束 th_a, th_b, th_c;
if(pthread_create (&th_a, 0, keyboard, 0) != 0)
exit(1);
pthread_join(th_a,NULL);
if(pthread_create (&th_b, 0, receive, 0) != 0)
exit(1);
pthread_join(th_b,NULL);
if(pthread_create (&th_c, 0, send, 0) != 0)
exit(1);
pthread_join(th_c,NULL);
//在此处补充填写代码?实现关闭串口功能
close(fd);