#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下的对应程序相关推荐

  1. linux查看刷卡pos机_pos机linux下的对应程序

    #include /*标准输入输出定义*/ #include #include /*标准函数库定义*/ #include /*Unix标准函数定义*/ #include /**/ #include / ...

  2. 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库文件. 安装 ...

  3. linux下软件编译终止,[2018年最新整理]linux下编译运行程序命令大全.ppt

    [2018年最新整理]linux下编译运行程序命令大全 1. 项目课题引入 2. Vi编辑器的使用方法 3. Linux中C语言程序的编辑 4. Linux中C语言程序的运行 5. 现场演示案例 课题 ...

  4. Linux下的示例程序

    linux下的示例程序 #if 0 /*  * 1. 遍历目录-1  */ #include <stdio.h> #include <dirent.h> #include &l ...

  5. linux如何编译wine,利用winelib编译一个可在linux下运行的程序

    利用winelib编译一个可在linux下运行的程序 只是想既可以使用linux的api,又可以使用windows的api #include #include #include #include in ...

  6. linux 编写完程序吗,linux下编写C++程序

    注:本文写的内容全部在ubuntu12.04下完成. 要在linux下写C++程序,要懂的一点编译的知识.下面介绍一下. 源代码->预处理器(负责将代码补充)->汇编程序(生成汇编语言)- ...

  7. Linux下C/C++程序编译链接加载过程中的常见问题及解决方法

    Linux下C/C++程序编译链接加载过程中的常见问题及解决方法 1 头文件包含的问题 报错信息 该错误通常发生在编译时,常见报错信息如下: run.cpp:2:10: fatal error: dl ...

  8. Linux 下几款程序内存泄漏检查工具

    Linux 下几款程序内存泄漏检查工具 chenyoubing | 发布于 2016-07-23 10:08:09 | 阅读量 93 | 无 写这篇博客的原因呢是因为自己在编写基于Nginx磁盘缓存管 ...

  9. 在linux 下编译c程序时“ error:dereferencing pointer to incomplete type”的问题

    在linux 下编译c程序时经常会遇到" error:dereferencing pointer to incomplete type"的问题,该问题的原因是:结构体定义不规范造成 ...

最新文章

  1. 一年成为emacs高手
  2. 最短路径 - 迪杰斯特拉(Dijkstra)算法
  3. nagios系列(七)nagios通过自定义脚本的方式监控mysql主从同步
  4. 【EIP】以太坊路线图
  5. 重庆新建建筑中绿色建材应用比例超过70%
  6. JVM内存与垃圾回收篇
  7. SQL注入基础语句大全
  8. 计算机打字声音,键盘打字声音在哪设置
  9. 考研英语 - word-list-49
  10. 移动硬盘加密后在linux中如何使用方法,移动硬盘上的文件加密方法
  11. AI修图!pix2pix网络介绍与tensorflow实现
  12. 华大(小华)HC32L130工程创建
  13. FPGA零基础学习:数码管驱动设计
  14. 页面布局整理汇总,让你彻底搞明白多种布局的关系
  15. MySQL:Got error 139 from storage engine
  16. java武士风度_情感故事:淡定,淡定,再淡定!
  17. openzeppelin
  18. 计算机网络——面试复习
  19. 电子招标系统的5大优势
  20. 5.1.8 服务器系统变量

热门文章

  1. 下载电影、软件、工具的利器--讯雷
  2. android 错误中英互译,安卓手机Recovery模式刷机情况下的中英文对照翻译
  3. 贴片电容封装尺寸与常规的贴片电阻的标准封装及额定功率 (转)
  4. 李嘉诚给年青商人的98条忠告
  5. STM32基础(11)光敏传感
  6. 分治算法小结(附例题详解)
  7. Soul Dance
  8. 单缝孔径平面内移动_傅里叶变换解夫琅禾费衍射问题的几个例子_3
  9. sql教程学习(一)
  10. python量化实战 顾比倒数线_顾比倒数线的画法