pos机linux下的对应程序
#include <stdio.h> /*标准输入输出定义*/
#include <string.h>
#include <stdlib.h> /*标准函数库定义*/
#include <unistd.h> /*Unix标准函数定义*/
#include <sys/types.h> /**/
#include <sys/stat.h> /**/
#include <fcntl.h> /*文件控制定义*/
#include <termios.h> /*PPSIX终端控制定义*/
#include <errno.h> /*错误号定义*/ /***@brief 设置串口通信速率 *@param fd 类型 int 打开串口的文件句柄 *@param speed 类型 int 串口速度 *@return void*/
#ifndef SI
#define SI 0xf
#endif #ifndef SO
#define SO 0xe
#endif #ifndef STX
#define STX 0x02
#endif #ifndef ETX
#define ETX 0x03
#endif int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300, B38400, B19200, B9600, B4800, B2400, B1200, B300,B115200 };
int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200, 9600, 4800, 2400, 1200, 300, 115200};
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; if ( tcgetattr( fd,&options) != 0) { perror("SetupSerial 1"); return(1); } 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 (1); } 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 (1); } /* 设置停止位*/ switch (stopbits) { case 1: options.c_cflag &= ~CSTOPB; break; case 2: options.c_cflag |= CSTOPB; break; default: fprintf(stderr,"Unsupported stop bits\n"); return (1); } /* Set input parity option */ if (parity != 'n') options.c_iflag |= INPCK; options.c_cc[VTIME] = 150; // 15 seconds options.c_cc[VMIN] = 0; tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */ if (tcsetattr(fd,TCSANOW,&options) != 0) { perror("SetupSerial 3"); return (1); } return (0);
}
/** *@breif 打开串口 */
int OpenDev(char *Dev)
{ int fd = open( Dev, O_RDWR ); //| O_NOCTTY | O_NDELAY if (-1 == fd) { /*设置数据位数*/ perror("Can't Open Serial Port"); return -1; } else return fd; }
/** *@breif main() */ int Rec232HostPacket(char *packet,int RS232DEV)
{ int len, resp, k, delay_times = 100; long i, j; char buf[6]; j = 10 * 50L; i = 0L; // while(1) { do { resp = read(RS232DEV, buf, 1); if(resp == 0){ continue; } else if(resp == 1) break; } while((!(buf[0] == STX && resp == 1))); if(buf[0] != STX || resp != 1) { return(-1); } k = 0; do { resp = read(RS232DEV, &buf[1 + k], 2 - k); k += resp; } while((k < 2) && i++ < j); len = ((buf[1] & 0xf0) >> 4) * 1000 + (buf[1] & 0x0f) * 100 + ((buf[2] & 0xf0) >> 4) * 10 + (buf[2] & 0x0f); if(k != 2 || len >1000) { return(-1); } k = 0; do { resp = read(RS232DEV, packet + k, len - k); k += resp; } while((k < len)); if(k != len) { return(-1); } k = 0; do { resp = read(RS232DEV, &buf[3 + k], 2 - k); k += resp; } while((k < 2)); if(k != 2) { return(-1); } if(buf[3] != ETX) { return(-1); } buf[5] = ETX; for(resp = 0; resp < len; resp ++) buf[5] ^= packet[resp]; buf[5] ^= buf[1]; buf[5] ^= buf[2]; if(buf[5] != buf[4]) { return(-1); } // if(packet[0] != 0x68) // break; } return(len);
} int Send232PosPacket(char *packet, int len,int RS232DEV)
{ char buf[6]; int i; // printf("aaa\n");// while(read(RS232DEV, buf, 6) > 0) ; // printf("aaa\n");buf[0] = STX; buf[1] = (unsigned char)(((((len / 1000) % 10) << 4) & 0xf0) | (((len / 100) % 10) & 0x0f)); buf[2] = (unsigned char)(((((len / 10) % 10) << 4) & 0xf0) | ((len % 10) & 0x0f)); buf[3] = ETX; buf[4] = ETX; buf[5] = '\r'; for(i = 0; i < len; i++) buf[4] ^= packet[i]; buf[4] ^= buf[1]; buf[4] ^= buf[2]; if(write(RS232DEV, buf, 3) != 3) return(-1); if(write(RS232DEV, packet, len) != len) return(-1); if(write(RS232DEV, buf + 3, 2) != 2) return(-1); return(len);
} int main(int argc, char **argv)
{ int fd; int nread; char buff[512]; char *dev ="/dev/ttyUSB0"; fd = OpenDev(dev); if (fd>0) set_speed(fd,115200); else { printf("Can't Open Serial Port!\n"); exit(0); } if (set_Parity(fd,8,1,'N')== 1) { printf("Set Parity Error\n"); exit(1); } while(1) { // while((nread = read(fd,buff,512))>0) // { // printf("\nLen %d\n",nread); // buff[nread+1]='\0'; // printf("\n%s",buff); // }// Rec232HostPacket(buff,fd);// printf("%s\n",buff);printf("请输入要发送的数据\n");memset(buff,0,sizeof(buff));scanf("%s",buff);Send232PosPacket(buff,strlen(buff),fd);} close(fd); exit(0);
}
pos机linux下的对应程序相关推荐
- linux查看刷卡pos机_pos机linux下的对应程序
#include /*标准输入输出定义*/ #include #include /*标准函数库定义*/ #include /*Unix标准函数定义*/ #include /**/ #include / ...
- Linux错误27,解决在linux下编译32程序出现“/usr/include/gnu/stubs.h:7:27: 致命错误:gnu/stubs-32.h:没有那个文件或目录问题”...
centos64位编译32位代码,出现/usr/include/gnu/stubs.h:7:27: 致命错误:gnu/stubs-32.h:没有那个文件或目录,需要安装32位的glibc库文件. 安装 ...
- linux下软件编译终止,[2018年最新整理]linux下编译运行程序命令大全.ppt
[2018年最新整理]linux下编译运行程序命令大全 1. 项目课题引入 2. Vi编辑器的使用方法 3. Linux中C语言程序的编辑 4. Linux中C语言程序的运行 5. 现场演示案例 课题 ...
- Linux下的示例程序
linux下的示例程序 #if 0 /* * 1. 遍历目录-1 */ #include <stdio.h> #include <dirent.h> #include &l ...
- linux如何编译wine,利用winelib编译一个可在linux下运行的程序
利用winelib编译一个可在linux下运行的程序 只是想既可以使用linux的api,又可以使用windows的api #include #include #include #include in ...
- linux 编写完程序吗,linux下编写C++程序
注:本文写的内容全部在ubuntu12.04下完成. 要在linux下写C++程序,要懂的一点编译的知识.下面介绍一下. 源代码->预处理器(负责将代码补充)->汇编程序(生成汇编语言)- ...
- Linux下C/C++程序编译链接加载过程中的常见问题及解决方法
Linux下C/C++程序编译链接加载过程中的常见问题及解决方法 1 头文件包含的问题 报错信息 该错误通常发生在编译时,常见报错信息如下: run.cpp:2:10: fatal error: dl ...
- Linux 下几款程序内存泄漏检查工具
Linux 下几款程序内存泄漏检查工具 chenyoubing | 发布于 2016-07-23 10:08:09 | 阅读量 93 | 无 写这篇博客的原因呢是因为自己在编写基于Nginx磁盘缓存管 ...
- 在linux 下编译c程序时“ error:dereferencing pointer to incomplete type”的问题
在linux 下编译c程序时经常会遇到" error:dereferencing pointer to incomplete type"的问题,该问题的原因是:结构体定义不规范造成 ...
最新文章
- 一年成为emacs高手
- 最短路径 - 迪杰斯特拉(Dijkstra)算法
- nagios系列(七)nagios通过自定义脚本的方式监控mysql主从同步
- 【EIP】以太坊路线图
- 重庆新建建筑中绿色建材应用比例超过70%
- JVM内存与垃圾回收篇
- SQL注入基础语句大全
- 计算机打字声音,键盘打字声音在哪设置
- 考研英语 - word-list-49
- 移动硬盘加密后在linux中如何使用方法,移动硬盘上的文件加密方法
- AI修图!pix2pix网络介绍与tensorflow实现
- 华大(小华)HC32L130工程创建
- FPGA零基础学习:数码管驱动设计
- 页面布局整理汇总,让你彻底搞明白多种布局的关系
- MySQL:Got error 139 from storage engine
- java武士风度_情感故事:淡定,淡定,再淡定!
- openzeppelin
- 计算机网络——面试复习
- 电子招标系统的5大优势
- 5.1.8 服务器系统变量