linux用中断接收串口数据的原代码!

linux用中断接收串口数据的原代码!,第1张

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

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

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

/******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是发送数据

在home目录下建立data目录

Linux下更改datadir的方式:

linux下,MySQL默认的数据文档存储目录为/var/lib/mysql。假如要把MySQL目录移到/home/data下需要进行下面几步:

1、home目录下建立data目录

cd /home

mkdir data

2、把MySQL服务进程停掉:

mysqladmin -u root -p shutdown

3、把/var/lib/mysql整个目录移到/home/data

mv /var/lib/mysql /home/data/

这样就把MySQL的数据文档移动到了/home/data/mysql下

4、找到my.cnf配置文档

假如/etc/目录下没有my.cnf配置文档,请到/usr/share/mysql/下找到*.cnf文档,拷贝其中一个到/etc/并改名为my.cnf)中。命令如下:

[root@test1  mysql]# cp /usr/share/mysql/my-medium.cnf /etc/my.cnf

5、编辑MySQL的配置文档/etc/my.cnf

为确保MySQL能够正常工作,需要指明mysql.sock文档的产生位置。修改socket=/var/lib/mysql/mysql.sock一行中等号右边的值为:/home/mysql/mysql.sock 。 *** 作如下:

vi  my.cnf  (用vi工具编辑my.cnf文档,找到下列数据修改之)

# The MySQL server

[mysqld]

port = 3306

#socket  = /var/lib/mysql/mysql.sock(原内容,为了更稳妥用“#”注释此行)

socket  = /home/data/mysql/mysql.sock (加上此行)

6、修改MySQL启动脚本/etc/init.d/mysql

最后,需要修改MySQL启动脚本/etc/init.d/mysql,把其中datadir=/var/lib/mysql一行中,等号右边的路径改成您现在的实际存放路径:home/data/mysql。

[root@test1  etc]# vi /etc/init.d/mysql

#datadir=/var/lib/mysql(注释此行)

datadir=/home/data/mysql (加上此行)

如果是CentOS还要改 /usr/bin/mysqld_safe 相关文件位置;

最后 做一个mysql.sock 链接:

ln -s /home/data/mysql/mysql.sock /var/lib/mysql/mysql.sock

如果,创建失败,那么 先进入目录/var/lib下创建目录mysql,在运行上面的命令

7、重新启动MySQL服务

/etc/init.d/mysql start

为了验证更改是否已经成功,我们可以在MySQL中新建一个命名为xunmeinet的数据库,建立完毕后观察C:\mysql\data文件夹是否多了一个与数据库名同名的文件夹,

Linux文件类型和Linux文件的文件名所代表的意义是两个不同的概念。\x0d\x0a一. 文件类型\x0d\x0aLinux文件类型常见的有:普通文件、目录文件、字符设备文件和块设备文件、符号链接文件等,现在我们进行一个简要的说明。\x0d\x0a1. 普通文件 \x0d\x0a用 ls -lh 来查看某个文件的属性,可以看到有类似-rwxrwxrwx,值得注意的是第一个符号是 - ,这样的文件在Linux中就\x0d\x0a是普通文件。这些文件一般是用一些相关的应用程序创建,比如图像工具、文档工具、归档工具... .... 或 cp工具等。这类文件的删除方式是用\x0d\x0arm 命令。 另外,依照文件的内容,又大略可以分为:\x0d\x0a1>. 纯文本档(ASCII):\x0d\x0a这是Linux系统中最多的一种文件类型,称为纯文本档是因为内容可以直接读到的数据,例如数字、字母等等。 用来做为\x0d\x0a设定的文件都属于这一种文件类型。 \x0d\x0a2>. 二进制文件(binary):\x0d\x0aLinux系统其实仅认识且可以执行二进制文件(binary file)。Linux当中的可执行文件(scripts, 文字型批处理文件不算)就是这种格式的文件。 命令cat就是一个binary file。\x0d\x0a3>. 数据格式文件(data): \x0d\x0a有些程序在运作的过程当中会读取某些特定格式的文件,那些特定格式的文件可以被称为数据文件 (data file)。举例来说,Linux\x0d\x0a在使用者登录时,都会将登录的数据记录在 /var/log/wtmp那个文件内,该文件是一个data file,能够透过last这个指令读出来。 \x0d\x0a2. 目录文件\x0d\x0a在某个目录下执行,看到有类似 drwxr-xr-x ,这样的文件就是目录,目录在Linux是一个比较特殊的文件。注意它的第一个字符是\x0d\x0ad。创建目录的命令可以用 mkdir 命令,或cp命令,cp可以把一个目录复制为另一个目录。删除用rm 或rmdir命令。 \x0d\x0a3. 字符设备或块设备文件 \x0d\x0a进入/dev目录,列一下文件,会看到类似如下的:\x0d\x0aroot@localhost ~]# ls -al /dev/tty\x0d\x0acrw-rw-rw- 1 root tty 5, 0 11-03 15:11 /dev/tty\x0d\x0a[root@localhost ~]# ls -la /dev/sda1\x0d\x0abrw-r----- 1 root disk 8, 1 11-03 07:11 /dev/sda1\x0d\x0a可以看到/dev/tty的属性是 crw-rw-rw- ,注意前面第一个字符是 c ,这表示字符设备文件。比如猫等串口设备。我们看到 /dev/sda1 的属性是 brw-r----- ,注意前面的第一个字符是b,这表示块设备,比如硬盘,光驱等设备。\x0d\x0a这个种类的文件,是用mknode来创建,用rm来删除。目前在最新的Linux发行版本中,一般不用自己来创建设备文件。因为这些文件是和内核相关联的。\x0d\x0a与系统周边及储存等相关的一些文件, 通常都集中在/dev这个目录之下。通常又分为两种:\x0d\x0a区块(block)设备档 :\x0d\x0a就是一些储存数据, 以提供系统随机存取的接口设备,举例来说,硬盘与软盘等就。 可以随机的在硬盘的不同区块读写,这种装置就是成组设备。可以自行查一下/dev/sda看看, 会发现第一个属性为[ b ]。\x0d\x0a字符(character)设备文件:\x0d\x0a亦即是一些串行端口的接口设备, 例如键盘、鼠标等等!这些设备的特色就是一次性读取的,不能够截断输出。\x0d\x0a4. 数据接口文件(sockets): \x0d\x0a数据接口文件(或者:套接口文件),这种类型的文件通常被用在网络上的数据承接了。可以启动一个程序来监听客户端的要求, 而客户端就可以透过这个socket来进行数据的沟通了。第一个属性为 [ s ], 最常在/var/run这个目录中看到这种文件类型了。


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

原文地址:https://54852.com/yw/7109595.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存