这是一个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设置“$”、“&yen;”、“&pound;”字符显示状态命令
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, “&yen;”字符 亮, 其它二种字符 暗。
(3) 当 n=3, “&pound;”字符 亮, 其它二种字符 暗。
(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位置。这个命令一般不需使用

解决方案 »

  1.   

    看不明白。你是用vc编译吗?在windows下不能用outputb了。搜搜串口类吧。
      

  2.   

    同意 zhang1000(多一个零) 应该是Turbo C程序
      

  3.   

    基本可以确定的是,这是一个c语法类型的程序。
    但是并不一定就是turbo c 程序。我以前见过的pos机开发小组中,有的pos机在买回来以后就带有自己的开发系统,但基本上都是遵循的c语言语法。可以先用tc试一下,如果不行,就找一下针对的pos机生产商是否有自己的开发系统。
      

  4.   

    1,不知道你的调不通是什么意思?编译不过还是程序无法运行?2,data[0]=0x0a;
       data[1]=0;
       SD(BASS2,data,2);
       这段是什么意思?你已经给COM1初始化为9600bit,
       为什么还要给COM2初始化?
       我觉得只要用两个COM口就可以了。
    3,你的POS机是2400bit,你把你的COM1设成了9600bit,为什么?4,程序不能运行的话,好好检查你的COM1的标志位的设定。