Linux串口相关的 *** 作及绑定

Linux串口相关的 *** 作及绑定,第1张

@ toc

可在控制台输入

也可以用stty设置串口参数

使用后相当于串口回传,发什么回什么

发送数据

可以对串口发送数据比如对com1口

一般情况下串口的名称全部在dev下面,如果你没有外插串口卡的话默认是dev下的ttyS* ,一般ttyS0对应com1,ttyS1对应com2,当然也不一定是必然的;

如果有ttyS设备,再看/dev/有没有ttyS*,如没有就建立一个:

如果板子的设备中没有标准串口设备ttyS0,也没有ttySAC0。/dev下应该有一个USB串口:/dev/ttyUSB0.

当一个串行卡或数据卡被侦测到时,它会被指定成为第一个可用的串行设备。通常是/dev/ttyS1(cua1)或/dev/ttyS2(cua2),这完成看原已内建的串口数目。ttyS*设备会被报告在/var/run/stab内。

PC上的串口一般是ttyS,板子上Linux的串口一般叫做ttySAC

可能是linux下的串口设备没有打开,需要改变串口设备

的权限,或者根据文章头添加用户到组处理

可以通过以下命令 查看 板子上的硬件端口的内核设备名

该条命令会将 ttyUSB0所对应的硬件端口的kernel设备名 显现出来, 得到KERNEL== '1-5.5.4', 而不是之前的ttyUSB0

cmd.sh如下:

./getUSB.py 调用当前路径下的getUSB.py这个Python语言,明确此次是哪个,ttyUSB0,或者ttyUSB1挂载在端口3-1.1上

getUSB.py:

完成之后 ,设置开机启动cmd.sh(在/etc/rc.local中设置)则每次开机之后,会从/dev/ttydata获取到固定端口的数据

方式一

写入内容如下:

方式二

我的硬件序列号:ATTRS{serial}=="FTSYWCXZ"这个号是唯一的

可以通过/dev/usb_0打开串口设备

常用的匹配类型:

以前写的,但是没写完,偏偏你要的那部分没写。呵呵~~

先声明,没调试过。。仅供参考,有错误的地方请指正,谢谢!

////////////////////////

/******setport.h*******/

////////////////////////

#ifndef SETPORT_H

#define SETPORT_H

/*********************

int dwBaudRate //波特率

char bTTY //串口号

char bDataBit //数据位5,6,7,8

char bParity //奇偶校验 无校验:'N' 偶校验'E' 奇校验'O'

char bStopBit //停止位1,2

char bFctl //流控制无控制:'N' 硬件控制:'H'软件控制:'S'

**********************/

//-------------------打开串口-------------------//bTTY==0,1,2,3, 对应串口Com1到Com4,成功返回文件描述符,失败==(-1)

extern int PortOpen(char bTTY)

//-------------------设置串口-------------------//成功==(0) 失败==(-1)

extern int PortSet(int dwFdcom,int dwBaudRate,char bTTY,char bDataBit,char bParity,char bStopBit,char bFctl)

//-------------------关闭串口-------------------//

extern void PortClose(int dwFdcom)

//-------------------写串口-------------------//成功返回datalen 失败==(<0)

extern int PortWrite(int dwFdcom,char *cpSendBuf,unsigned int DataLen)

//-------------------读串口-------------------//成功返回datalen 失败==(-1)

extern int PortRead(int dwFdcom,char *cpRecvBuf,unsigned int DataLen,unsigned int dwBaudRate)

//-------------------超时设置-------------------//成功==0失败==(<0)

extern int PortTimeOut(int dwFdcom, char timeout, int len)

#endif

/////////////////////////////

/***********setport.c*******/

////////////////////////////

#include <stdio.h>

#include <fcntl.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

#include <termios.h>

#include <sys/times.h>

#include <sys/types.h>

#include <sys/ioctl.h>

#include "setport.h"

//-------------------打开串口-------------------//

extern int PortOpen(char bTTY)

{

int dwFdcom

unsigned char Ptty[10]="/dev/ttyS"

unsigned char *cpGtty

cpGtty=strcat(Ptty,&bTTY)

if(!cpGtty) return -1

else {

dwFdcom=open(cpGtty,O_RDWR|O_NOCTTY)

}

return (dwFdcom)

}

//-------------------关闭串口-------------------//

extern void PortClose(int dwFdcom)

{

close(dwFdcom)

}

//-------------------设置串口-------------------//

extern int PortSet(int dwFdcom,int dwBaudRate,char bTTY,char bDataBit,char bParity,char bStopBit,char bFctl)

{

static int speed_arr[] = {B38400, B19200, B9600, B4800, B2400, B1200, B300, B38400, B19200, B9600, B4800, B2400, B1200, B300}

static int name_arr[] = {38400, 19200, 9600, 4800, 2400,1200, 300, 38400, 19200, 9600, 4800, 2400, 1200, 300}

struct termios oldtm_t,newtm_t

int i=0char *pDatabit

bzero(&oldtm_t,sizeof(oldtm_t))

bzero(&newtm_t,sizeof(newtm_t))

cfmakeraw(&newtm_t)

tcgetattr(dwFdcom,&oldtm_t)

/*------------设置端口属性------------*/

for( i<sizeof(speed_arr)/sizeof(int) i++)

{

if(dwBaudRate==name_arr[i])

{

cfsetispeed(&newtm_t,speed_arr[i])

cfsetospeed(&newtm_t,speed_arr[i])

}

else return -1

}

newtm_t.c_cflag|=CLOCAL

newtm_t.c_cflag|=CREAD

newtm_t.c_cflag &= ~CSIZE

switch(bDataBit) //数据位

{

case '5':

newtm_t.c_cflag|=CS5

break

case '6':

newtm_t.c_cflag|=CS6

break

case '7':

newtm_t.c_cflag|=CS7

break

case '8':

newtm_t.c_cflag|=CS8

break

default:

return -2

}

switch(bParity)

{

case 'N':{ //无校验

newtm_t.c_cflag&=~PARENB

newtm_t.c_iflag&= ~INPCK

}break

case 'O':{ //奇校验

newtm_t.c_cflag |= (PARODD | PARENB)

newtm_t.c_iflag |= INPCK

}break

case 'E':{ //偶校验

newtm_t.c_cflag |= PARENB

newtm_t.c_cflag &= ~PARODD

newtm_t.c_iflag |= INPCK

}break

default:

return -3

}

//停止位

if(bStopBit=='2') newtm_t.c_cflag|=CSTOPB //2

else newtm_t.c_cflag&=~CSTOPB //1

switch(bFctl) //流控制

{

case 'N':{ //无控制

newtm_t.c_cflag &= ~CRTSCTS

newtm_t.c_iflag &= ~(IXON | IXOFF | IXANY )

}break

case 'H':{ //硬件控制

newtm_t.c_cflag |= CRTSCTS

newtm_t.c_iflag &= ~(IXON | IXOFF | IXANY )

}break

case 'S':{ //软件控制

newtm_t.c_cflag &= ~CRTSCTS

newtm_t.c_iflag |= (IXON | IXOFF | IXANY )

}break

default:

return -4

}

tcflush(dwFdcom,TCIFLUSH)//端口复位

tcsetattr(dwFdcom,TCSANOW,&newtm_t) //使端口属性设置生效

return 0

}

//-------------------超时设置-------------------//

extern int PortTimeOut(int dwFdcom, char timeout, int len)

{

struct termios newtm_t

if(tcgetattr(dwFdcom, &newtm_t) != 0)

{

return (-1)

}

newtm_t.c_lflag &= ~ICANON

newtm_t.c_cc[VTIME] = timeout

newtm_t.c_cc[VMIN] = len

if(tcsetattr(dwFdcom, TCSANOW, &newtm_t) != 0)

{

return (-2)

}

return 0

}

////读写串口用文件读写方式,read和write两个方法,

////read是接收数据,write是发送数据

虚拟机中的串口连接可以采用两种方法。一种是指定虚拟机的串口连接到实际的COM上,例如开发机连接到COM1,目标机连接到COM2,然后把两个串口通过串口线相连接。另一种更为简便的方法是:在较高一些版本的VMware中都支持把串口映射到命名管道,把两个虚拟机的串口映射到同一个命名管道。例如,在两个虚拟机中都选定同一个命名管道 \\.\pipe\com_1,指定target机的COM口为server端,并选择"The other end is a virtual machine"属性;指定development机的COM口端为client端,同样指定COM口的"The other end is a virtual machine"属性。对于IO mode属性,在target上选中"Yield CPU on poll"复选择框,development机不选。

串口是开发者经常要使用到的,我们有些时候需要使用windows开发,然而window装在了虚拟机中,我们怎么样在虚拟机中使用串口呢?

1、在virtualbox中选择启用串口,端口模式选择Host device.

由于现有两个系统但是只有一个物理串口,所以虚拟机要通过主机的串口文件间接获取数据,主机是linux,串口设备为/dev/ttyS0

2、端口/文件位置一栏填入:/dev/ttyS0,启动虚拟机。

3、如果无法启动虚拟机,很有可能是没有对ttyS0设备的读写权限,(可以ls -l /dev/ttyS0查看以下权限)于是我们要修改ttyS0的权限,在终端中输入:sudo chmod 777 /dev/ttyS0 这样就将ttyS0的所有权限都打开了。启动虚拟机,这时候就可以在虚拟机中(winXP)使用串口了


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/7684829.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-08
下一篇 2023-04-08

发表评论

登录后才能评论

评论列表(0条)

保存