//注意: 此版本打印格式为山东省济南市地税局服务业机建筑业发票 2004.5.8
#include <stdio.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> /*错误号定义 */
#include <time.h> /*时间函数*/
#include <sys/time.h>
//#include <sys/io.h>
#include <getopt.h>
#include <linux/lp.h>
#include <string.h>
#include <sys/ioctl.h>
#include "sk.h"
#include "error.h"
//#include "TaxCtrlPro.h"
//---------------------------------------------------------------------------
#define FALSE -1
#define TRUE 0
#define USE_44B0_POS
#define SKPORT 2 //定义 税控器接入 端口
//#define TaxUnitPort 2 //com 1
//#define SPRTPRINTER
#define init_debug
#define sm_debug
//#define debug
#define SprtPrinter //斯普瑞特打印机
//#define GongDaLptPrinter //公达打印机
//#define StarPrinter //Star打印机
//#define debug
int printinvoicetype; //设定打印发票类型: 1:餐饮;0:建筑;
//---------------------------------------------------------------------------
unsigned char *com_dev1 ="/dev/ttyS0"; //串口1
//unsigned char *com_dev1 ="/dev/ttyUSB0"; //usb 1
unsigned char *com_dev2 ="/dev/ttyS1"; //串口2
unsigned char *com_dev3 ="/dev/ttyS2"; //串口3
unsigned char *com_dev4 ="/dev/ttyS3"; //串口4
/*
const char *com_dev1 ="/dev/ttyS0";
const char *com_dev2 ="/dev/ttyS1";
const char *com_dev3 ="/dev/ttyS2";
const char *com_dev4 ="/dev/ttyS3";
*/
//---------------------------------------------------------------------------
int execute_blackmark_flag=1; //execute_blackmark_flag=1:打印时检测黑标 =0:不检测黑标
unsigned char sellpath[] = "/tmp/tmpsellnote.txt";
int idComm1,idComm2,idComm3,idComm4; //串口 ID
int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,
B38400, B19200, B9600, B4800, B2400, B1200, B300, 0};
int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300,
38400, 19200, 9600, 4800, 2400, 1200, 300, 0};
//---------------------------------------------------------------------------
struct OneBillDate_struct //当前张发票信息结构
{
unsigned char bill_type;
char tax_items_list[6];
int item_total_money[6];
};
unsigned char User_Name[41]; //本税控器单位名称
unsigned char User_ID[17]; //本税控器纳税人编码
unsigned char User_Machine[17]; //本税控器机器编号
unsigned char prevent_forge_code[25]; //防伪税控码
//---------------------------------------------------------------------------
void Show_Bill_Query_Info(struct Query_1 *checkData);
void Show_boot_strap_init(struct TaxStatus *statusData);
void Show_DAY_Query_Info(struct Query_2 *checkData);
void Show_DECLARE_Query_Info(struct Query_3 *checkData);
void Show_TAX_BringIntoEffect_Info(struct InvoiceListData *checkData);
void ShowSaleData_wst(struct SaleData *nowSaleData);
int JudgeNowBillNumberInfo(unsigned char *now_hex_bill_number,unsigned char *now_hex_billend_number);
void Print_NoSoft_Line(unsigned char *Line_Str);
int Boot_StrapRenewBill(void); //功能: 开机发票重现
void m_dtrtoggle(int fd,int sec)
{
/* Posix - set baudrate to 0 and back */
struct termios tty, old;
tcgetattr(fd, &tty);
tcgetattr(fd, &old);
cfsetospeed(&tty, B0);
cfsetispeed(&tty, B0);
tcsetattr(fd, TCSANOW, &tty);
if (sec>0)
{
sleep(sec);
tcsetattr(fd, TCSANOW, &old);
}
}
//---------------------------------------------------------------------------
//设置串口通信速率
//fdtmp 类型 int 打开串口的文件句柄
//speed 类型 int 串口速度
void SetSpeed(int fdtmp, int speed)
{
int i;
int status;
int tmp;
struct termios Opt;
tmp=tcgetattr(fdtmp, &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]);
Opt.c_cflag |= (CLOCAL | CREAD);
Opt.c_lflag &=~(ICANON | ECHO | ECHOE | ISIG); //设置为RAW模式
Opt.c_oflag &=~OPOST; //设置为RAW模式
Opt.c_iflag &=~(IXON | ICRNL); //通讯中不处理控制字符
//tcflush(fdtmp,TCIOFLUSH);
status = tcsetattr(fdtmp, TCSANOW, &Opt);
if(status != 0)
perror("tcsetattr fd1");
return;
}
tcflush(fdtmp,TCIOFLUSH);
}
}
//---------------------------------------------------------------------------
//设置串口数据位,停止位和效验位
// fd 类型 int 打开的串口文件句柄*
// databits 类型 int 数据位 取值 为 7 或者8*
// stopbits 类型 int 停止位 取值为 1 或者2*
// parity 类型 int 效验类型 取值为N,E,O,,S
int SetParity(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 (FALSE);
}
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 (FALSE);
}
/* 设置停止位*/
switch (stopbits)
{
case 1: options.c_cflag &= ~CSTOPB;
break;
case 2: options.c_cflag |= CSTOPB;
break;
default: fprintf(stderr,"Unsupported stop bits\n");
return (FALSE);
}
/* Set input parity option */
if (parity != 'n')
options.c_iflag |= INPCK;
options.c_cc[VTIME] = 10; // 15 seconds
options.c_cc[VMIN] = 0;
tcflush(fd,TCIOFLUSH); /* Update the options and do it NOW */
if(tcsetattr(fd,TCSANOW,&options) != 0)
{
perror("SetupSerial 3");
return (-1);
}
return (0);
}
//---------------------------------------------------------------------------
//打开串口
int OpenDev(const char *Dev)
{ int fd = open( Dev, O_RDWR | O_NOCTTY);
if ( (-1 == fd) || (-2 == fd) )
{ /*设置数据位数*/
perror("Can't Open Serial Port");
return -1;
}
return fd;
}
//---------------------------------------------------------------------------
//串口初始化
int ComPortInit( int PortNo,int speed )
{
unsigned char buf[80];
int fd_com=0;
memset( buf,0,80 );
switch( PortNo )
{
case 1: fd_com = OpenDev( com_dev1 );
break;
case 2: fd_com = OpenDev( com_dev2 );
break;
case 3: fd_com = OpenDev( com_dev3 );
break;
case 4: fd_com = OpenDev( com_dev4 );
break;
}
if(fd_com > 0)
SetSpeed( fd_com,speed );
else
{ sprintf( buf,"Can't Open Serial Port %d",PortNo );
return -1;
}
if( SetParity( fd_com,8,1,'N' )== FALSE )
{ sprintf( buf,"Set COM%d Parity Error",PortNo );
return -2;
}
return fd_com; //返回 串口 ID
}
//---------------------------------------------------------------------------
void MyDebugShow(unsigned char *data,int len)
{
#ifdef debug
printf("Debug Info:");
for(int i=0;i<len;i++)
printf(" %x",data[i]);
printf("\n");
#endif
;
}
//功能: 用于串口接收数据(原因:'税控器发回的数据带有杂�
API_functions.rar_uclinux_嵌入
版权申诉
98 浏览量
2022-09-22
16:37:03
上传
评论
收藏 112KB RAR 举报
四散
- 粉丝: 51
- 资源: 1万+
最新资源
- 基于Python和PyTorch框架完成的一个手写数字识别实验源码(带MINIST手写数字数据集)+详细注释(高分项目)
- 基于Matlab在MNIST数据集上利用CNN完成手写体数字识别任务,并实现单层CNN反向传播算法+源代码+文档说明(高分项目)
- NVIDIA驱动、CUDA和Pytorch及其依赖
- html动态爱心代码一(附源码)
- c40539bc-071a-486c-9d52-9d0c18d62dac 4.html
- 基于物理的非视域成像(NLOS)算法,利用了nerf+python源码+文档说明
- yuluer知更鸟.7z(1).001
- python课程设计-基于tensorflow实现的图文生成程序,数据集flickr30k-images+源代码+文档说明+截图
- python作业-基于Flickr30k数据集实现图像文本跨模态搜索python源码+数据集+测试界面+项目说明(高分课程设计)
- 基于Qt实现医院信息管理系统c++源码+文档说明+数据库(期末大作业)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈