这是一个POS机顾客显示屏程序,无法编译,请问高手指出错误。另附顾显技术资料。
#include <stdio.h>
#include <string.h>
#include <bios.h>
#include <dos.h>
#include <math.h>
#include <stdlib.h>
#include <conio.h>#define BASS1 0x3E8
#define BASS2 0x2E8
#define BASS3 0x3e8void my_wait(double num);
void sendch(int BASS,char c);
void initcom1(int BASS);
void OpenQX(int BASS);
void SD(int BASS,unsigned char *p,int L);
void P_hz(int BASS,int stat,int da1,double da2);
void Comm(int BASS,int stat,int num);
void HZ_chang(int BASS,int No,unsigned char *Chines,int L);
void HZ_chang1(int BASS,unsigned char *Chines);
void HZ_chang2(int BASS,unsigned char *Chines1,unsigned char *Chines2);
void CCharSplit( unsigned char *CharBitmap,
unsigned char *OddLine,unsigned char *EvenLine);main(int argc,unsigned char *argv[])
{
int i;
unsigned char data[100];
unsigned char data1[100];
float Da_ta;
struct date Di;
if(argc!=2) return 0;
getdate(&Di);
initcom1(BASS1);
data[0]=0x0a;
data[1]=0;
SD(BASS2,data,2);
//OpenQX(BASS3);
//Comm(BASS3,1,0); data1[0]=27;
data1[1]=0x51;
data1[2]=0x41;
strcpy(data,data1);
strcat(data,"Y= ");
strcat(data,argv[1]); SD(BASS1,data,22);
}
/******************************************/
/* 下段程序功能为 COM1 初始化子程序 */
/******************************************/void initcom1(int BASS)
{
outportb(BASS+3,0x80); /*开启波特率锁存器*/
outportb(BASS,0x0a); /*9600 波特率*/
outportb(BASS+1,0x00); /*9600 波特率*/
outportb(BASS+3,0x03); /*八位数据位,无效验位*/
/*outportb(BASS+4,0x0b); outportb(BASS+1,0x00); 不允许RS232中断*/
/*outportb(0x21,inportb(0x21) & 0xef);*/
}/**********************************************/
/* 下段程序功能为从COM1发送单个字符子程序 */
/**********************************************/void sendch(int BASS,char c)
{
while(!(inportb(BASS+5)&0x20));
outportb(BASS,c);
}/**********************************************/
/* 下段程序功能为从COM1发送多个字符子程序 */
/**********************************************/void SD(int BASS,unsigned char *p,int L)
{
int i;
unsigned char ch;
unsigned char *pf;
pf=p;
for (i=0;i<L;i++){
sendch(BASS,*pf);
pf++;
}
}技术参数说明:
一. 硬件通讯参数
1. 通讯端口:串口
2. 波特率:2400 bit
3. 校验位:无
4. 数据位:8 bit
5. 停止位:1 bit
二. 采用国际ESC/POS标准通用指令集,无论在DOS或WINDOWS的平台下,只需按照指令集的格式向串口送数据即可显示内容。
三. 无需握手信号。驱动说明:
一、 在DOS下无需启动任何程序,在光标提示下直接输入数据即可测试连线是否完好。
C:\>MODE COM1 2400,N,8,1
C:\>TYPE CON>COM1
此时直接在光标处输入数字,按回车即可显示数字到显示屏。测试成功以后按Ctrl+C键退出编辑状态,回到DOS状态。
ESC/POS命令集明细表
1. STX B n波特率设置命令
ACSII码 格式:STX B n 0<=n<=5
十进制 格式:[002][066]n 48<=n<=53
十六进制 格式:[02H][42H]n 30H<=n<=35H
说明:改变系统的波特率(上电开机时缺省波特率为:2400bit/s),这个命令一般不需用到,使用缺省设定即可。
ASCII n 十进制n 十六进制n 波特率
0 48 30H 9600
1 49 31H 4800
2 50 32H 2400
3 51 33H 1200
4 52 34H 600
5 53 35H 3002. US M开钱箱命令
ACSII码 格式:US M
十进制 格式:[031][077]
十六进制 格式:[1FH][4DH]
说明:通过顾客显示屏开启钱箱,请注意目前该命令与PD-LED8、PD-LED8N、PD-LED12N、PD-VFD220、PD-VFD215C、PD-VFD215CV的命令格式不同,不过以后会与它们改为一样。3. ESC @初始化命令
ASCII码 格式:ESC @
十进制 格式:[027][064]
十六进制 格式:[1BH][40H]
说明:恢复到上电开机时的状态。4. CLR清屏命令
ASCII码 格式:CLR
十进制 格式:[012]
十六进制 格式:[0CH]
说明:清除屏幕上的所有字符。5. ESC Q A d1d2d3…dn CR送显示数据命令
ASCII码 格式:ESC Q A d1d2d3…dn CR
十进制 格式:[027][081][065]d1d2d3…dn[013] 48<=dn<=57或dn=45或dn=46
十六进制 格式:[1BH][51H][41H]d1d2d3…dn[0DH]
30H<=dn<=39H或dn=2DH或dn=2EH
说明:
a. 执行该命令时,会以覆盖模式送要显示的数据,这样就不需要在每次送显示数据前都去执行CAN清除光标行命令了。
b. 显示的d1…dn没有小数点时1<=n<=8。
c. 显示的d1…dn有小数点时1<=n<=15(8位数值+7位小数点)。
d. 显示的内容可用CLR或CAN命令清除。6. ESC s n设置“收款”、“单价”、“总计”、“找零”字符显示状态命令
ASCII码 格式:ESC s n 0<=n<=4
十进制 格式:[027][115] n 48<=n<=52
十六进制 格式:[1BH][73H] n 30H<=n<=34H
说明:(1)当 n=0,四种字符 全暗。
(2)当 n=1,“单价”字符 亮,其它三种 全暗。
(3)当 n=2,“总计”字符 亮,其它三种 全暗。
(4)当 n=3,“收款”字符 亮,其它三种 全暗。
(5)当 n=4,“找零”字符 亮,其它三种 全暗。7. US _ n m设置“多谢惠顾”字符、“动态线”显示状态命令
ASCII码 格式:US _ n m 0<=n<=3 0<=m<=2
十进制 格式:[031][095] n m 48<=n<=51 48<=m<=50
十六进制 格式:[1FH][5FH] n m 30H<=n<=33H 30H<=m<=32H
说明:通过这个命令可以是顾客显示屏的显示更加生动活泼。
(1) 当 n=0, “多谢惠顾”字符 全暗。
(2) 当 n=1, “多谢惠顾”字符 全亮。
(3) 当 n=2, “多谢惠顾”字符 转动。
(4) 当 n=3, “多谢惠顾”字符 闪烁。
(5) 当 m=0, “动态线” 全暗。
(6) 当 m=1, “动态线” 全亮。
(7) 当 m=2, “动态线” 转动。8. US s n设置“$”、“¥”、“£”字符显示状态命令
ASCII码 格式:US s n 0<=n<=5
十进制 格式:[031][115] n 48<=n<=53
十六进制 格式:[1FH][73H] n 30H<=n<=35H
说明:(1) 当 n=0, 三种字符 全暗。
(2) 当 n=1, “$”字符 亮, 其它二种字符 暗。
(3) 当 n=2, “¥”字符 亮, 其它二种字符 暗。
(3) 当 n=3, “£”字符 亮, 其它二种字符 暗。
(4) 当 n=4, 三种字符 全亮。
(5) 当 n=5, 三种字符 转动。9. US P n设置“POS SYSTEM”字符显示状态命令
ASCII码 格式:US P n 0<=n<=1
十进制 格式:[031][080] n 48<=n<=49
十六进制 格式:[1FH][50H] n 30H<=n<=31H
说明:(1) 当 n=0 , 字符 暗。
(2) 当 n=1 , 字符 亮。10. CAN 清除光标行命令
ASCII 码 格式:CAN
十进制 格式:[024]
十六进制 格式:[18H]
说明:清除光标行(数码行)上的字符,光标移动到第1位置。一般不需使用,只使用ESC Q A d1d2d3…dn CR命令即可。11. ESC _ n设置光标状态命令
ASCII码 格式:ESC _ n 0<=n<=1
十进制 格式:[027] [095] n 48<=n<=49
十六进制 格式:[1BH][5FH] n 30H<=n<=31H
说明:这个命令一般不需使用。
(1) 当n=0 时,光标 暗
(2) 当n=1 时,光标 亮12. ESC I x移动光标状态命令
ASCII码 格式:ESC I n 1<=n<=8
十进制 格式:[027][108] n 49<=n<=56
十六进制 格式:[1BH][6CH] n 31H<=n<=38H
说明:把光标移动到第n位置。这个命令一般不需使用
#include <stdio.h>
#include <string.h>
#include <bios.h>
#include <dos.h>
#include <math.h>
#include <stdlib.h>
#include <conio.h>#define BASS1 0x3E8
#define BASS2 0x2E8
#define BASS3 0x3e8void my_wait(double num);
void sendch(int BASS,char c);
void initcom1(int BASS);
void OpenQX(int BASS);
void SD(int BASS,unsigned char *p,int L);
void P_hz(int BASS,int stat,int da1,double da2);
void Comm(int BASS,int stat,int num);
void HZ_chang(int BASS,int No,unsigned char *Chines,int L);
void HZ_chang1(int BASS,unsigned char *Chines);
void HZ_chang2(int BASS,unsigned char *Chines1,unsigned char *Chines2);
void CCharSplit( unsigned char *CharBitmap,
unsigned char *OddLine,unsigned char *EvenLine);main(int argc,unsigned char *argv[])
{
int i;
unsigned char data[100];
unsigned char data1[100];
float Da_ta;
struct date Di;
if(argc!=2) return 0;
getdate(&Di);
initcom1(BASS1);
data[0]=0x0a;
data[1]=0;
SD(BASS2,data,2);
//OpenQX(BASS3);
//Comm(BASS3,1,0); data1[0]=27;
data1[1]=0x51;
data1[2]=0x41;
strcpy(data,data1);
strcat(data,"Y= ");
strcat(data,argv[1]); SD(BASS1,data,22);
}
/******************************************/
/* 下段程序功能为 COM1 初始化子程序 */
/******************************************/void initcom1(int BASS)
{
outportb(BASS+3,0x80); /*开启波特率锁存器*/
outportb(BASS,0x0a); /*9600 波特率*/
outportb(BASS+1,0x00); /*9600 波特率*/
outportb(BASS+3,0x03); /*八位数据位,无效验位*/
/*outportb(BASS+4,0x0b); outportb(BASS+1,0x00); 不允许RS232中断*/
/*outportb(0x21,inportb(0x21) & 0xef);*/
}/**********************************************/
/* 下段程序功能为从COM1发送单个字符子程序 */
/**********************************************/void sendch(int BASS,char c)
{
while(!(inportb(BASS+5)&0x20));
outportb(BASS,c);
}/**********************************************/
/* 下段程序功能为从COM1发送多个字符子程序 */
/**********************************************/void SD(int BASS,unsigned char *p,int L)
{
int i;
unsigned char ch;
unsigned char *pf;
pf=p;
for (i=0;i<L;i++){
sendch(BASS,*pf);
pf++;
}
}技术参数说明:
一. 硬件通讯参数
1. 通讯端口:串口
2. 波特率:2400 bit
3. 校验位:无
4. 数据位:8 bit
5. 停止位:1 bit
二. 采用国际ESC/POS标准通用指令集,无论在DOS或WINDOWS的平台下,只需按照指令集的格式向串口送数据即可显示内容。
三. 无需握手信号。驱动说明:
一、 在DOS下无需启动任何程序,在光标提示下直接输入数据即可测试连线是否完好。
C:\>MODE COM1 2400,N,8,1
C:\>TYPE CON>COM1
此时直接在光标处输入数字,按回车即可显示数字到显示屏。测试成功以后按Ctrl+C键退出编辑状态,回到DOS状态。
ESC/POS命令集明细表
1. STX B n波特率设置命令
ACSII码 格式:STX B n 0<=n<=5
十进制 格式:[002][066]n 48<=n<=53
十六进制 格式:[02H][42H]n 30H<=n<=35H
说明:改变系统的波特率(上电开机时缺省波特率为:2400bit/s),这个命令一般不需用到,使用缺省设定即可。
ASCII n 十进制n 十六进制n 波特率
0 48 30H 9600
1 49 31H 4800
2 50 32H 2400
3 51 33H 1200
4 52 34H 600
5 53 35H 3002. US M开钱箱命令
ACSII码 格式:US M
十进制 格式:[031][077]
十六进制 格式:[1FH][4DH]
说明:通过顾客显示屏开启钱箱,请注意目前该命令与PD-LED8、PD-LED8N、PD-LED12N、PD-VFD220、PD-VFD215C、PD-VFD215CV的命令格式不同,不过以后会与它们改为一样。3. ESC @初始化命令
ASCII码 格式:ESC @
十进制 格式:[027][064]
十六进制 格式:[1BH][40H]
说明:恢复到上电开机时的状态。4. CLR清屏命令
ASCII码 格式:CLR
十进制 格式:[012]
十六进制 格式:[0CH]
说明:清除屏幕上的所有字符。5. ESC Q A d1d2d3…dn CR送显示数据命令
ASCII码 格式:ESC Q A d1d2d3…dn CR
十进制 格式:[027][081][065]d1d2d3…dn[013] 48<=dn<=57或dn=45或dn=46
十六进制 格式:[1BH][51H][41H]d1d2d3…dn[0DH]
30H<=dn<=39H或dn=2DH或dn=2EH
说明:
a. 执行该命令时,会以覆盖模式送要显示的数据,这样就不需要在每次送显示数据前都去执行CAN清除光标行命令了。
b. 显示的d1…dn没有小数点时1<=n<=8。
c. 显示的d1…dn有小数点时1<=n<=15(8位数值+7位小数点)。
d. 显示的内容可用CLR或CAN命令清除。6. ESC s n设置“收款”、“单价”、“总计”、“找零”字符显示状态命令
ASCII码 格式:ESC s n 0<=n<=4
十进制 格式:[027][115] n 48<=n<=52
十六进制 格式:[1BH][73H] n 30H<=n<=34H
说明:(1)当 n=0,四种字符 全暗。
(2)当 n=1,“单价”字符 亮,其它三种 全暗。
(3)当 n=2,“总计”字符 亮,其它三种 全暗。
(4)当 n=3,“收款”字符 亮,其它三种 全暗。
(5)当 n=4,“找零”字符 亮,其它三种 全暗。7. US _ n m设置“多谢惠顾”字符、“动态线”显示状态命令
ASCII码 格式:US _ n m 0<=n<=3 0<=m<=2
十进制 格式:[031][095] n m 48<=n<=51 48<=m<=50
十六进制 格式:[1FH][5FH] n m 30H<=n<=33H 30H<=m<=32H
说明:通过这个命令可以是顾客显示屏的显示更加生动活泼。
(1) 当 n=0, “多谢惠顾”字符 全暗。
(2) 当 n=1, “多谢惠顾”字符 全亮。
(3) 当 n=2, “多谢惠顾”字符 转动。
(4) 当 n=3, “多谢惠顾”字符 闪烁。
(5) 当 m=0, “动态线” 全暗。
(6) 当 m=1, “动态线” 全亮。
(7) 当 m=2, “动态线” 转动。8. US s n设置“$”、“¥”、“£”字符显示状态命令
ASCII码 格式:US s n 0<=n<=5
十进制 格式:[031][115] n 48<=n<=53
十六进制 格式:[1FH][73H] n 30H<=n<=35H
说明:(1) 当 n=0, 三种字符 全暗。
(2) 当 n=1, “$”字符 亮, 其它二种字符 暗。
(3) 当 n=2, “¥”字符 亮, 其它二种字符 暗。
(3) 当 n=3, “£”字符 亮, 其它二种字符 暗。
(4) 当 n=4, 三种字符 全亮。
(5) 当 n=5, 三种字符 转动。9. US P n设置“POS SYSTEM”字符显示状态命令
ASCII码 格式:US P n 0<=n<=1
十进制 格式:[031][080] n 48<=n<=49
十六进制 格式:[1FH][50H] n 30H<=n<=31H
说明:(1) 当 n=0 , 字符 暗。
(2) 当 n=1 , 字符 亮。10. CAN 清除光标行命令
ASCII 码 格式:CAN
十进制 格式:[024]
十六进制 格式:[18H]
说明:清除光标行(数码行)上的字符,光标移动到第1位置。一般不需使用,只使用ESC Q A d1d2d3…dn CR命令即可。11. ESC _ n设置光标状态命令
ASCII码 格式:ESC _ n 0<=n<=1
十进制 格式:[027] [095] n 48<=n<=49
十六进制 格式:[1BH][5FH] n 30H<=n<=31H
说明:这个命令一般不需使用。
(1) 当n=0 时,光标 暗
(2) 当n=1 时,光标 亮12. ESC I x移动光标状态命令
ASCII码 格式:ESC I n 1<=n<=8
十进制 格式:[027][108] n 49<=n<=56
十六进制 格式:[1BH][6CH] n 31H<=n<=38H
说明:把光标移动到第n位置。这个命令一般不需使用
解决方案 »
- 圆弧的坐标计算
- 请问大侠,我的MFC程序界面为什么不能出现?
- 为什么edit的onchange事件没响应的?
- 100分鼓励:WINCE串口发送数据总是乱码?(在线等待)
- 网上协同开发带来的问题:给伙伴源码却让他看不懂
- 垃圾问题求解!数组与模板的问题
- 请教各位大哥,问一个小问题,什么是程序的"鲁棒性"???
- 怎样通过vc实现ftp数据包的分析
- 用了一个第三方的类 多线程调用一个函数时候发生冲突 如何百分百保证线程安全
- 请教各位高手如何使用vc存取ACCESS数据库中的OLE对象(图片等)?急死乐!
- 丛CImageList对象中取的CBitmap的问题
- 如何在不重起计算机的情况下更改本机ip地址?十分急!
但是并不一定就是turbo c 程序。我以前见过的pos机开发小组中,有的pos机在买回来以后就带有自己的开发系统,但基本上都是遵循的c语言语法。可以先用tc试一下,如果不行,就找一下针对的pos机生产商是否有自己的开发系统。
data[1]=0;
SD(BASS2,data,2);
这段是什么意思?你已经给COM1初始化为9600bit,
为什么还要给COM2初始化?
我觉得只要用两个COM口就可以了。
3,你的POS机是2400bit,你把你的COM1设成了9600bit,为什么?4,程序不能运行的话,好好检查你的COM1的标志位的设定。