各位大侠,小弟因为项目需要,需要操纵一个串口打印机,遇到几个问题,希望各位不吝赐教。 我是用Windows API函数 CreateFile()来打开的串口,打印机驱动是安装在Com1上面的,我用串口小助手的打开Com1的时候提示“初始化缓冲区失败”,而Com2没有问题,我怀疑是打印机的驱动占用了Com1, 不知道是否正确(问题1)? 还有就是我用WriteFile(), 将数据写到来串口,返回值也是1,应该就是写正确了啊,同时我也看到打印机队列里面会有一个任务,但是我用ReadFile()来读取的时候,却读不到我写进去的数据,一直是为空的,我还是照着网上的事例来做的,不知到哪里不正确,Com1和Com2都读不到。(问题2)
写数据:
char lpOutBuffer[7];
memset(lpOutBuffer,'\0',7); //前7个字节先清零
lpOutBuffer[0]='\x11'; //发送缓冲区的第1个字节为DC1
lpOutBuffer[1]='0'; //第2个字节为字符0(30H)
lpOutBuffer[2]='0'; //第3个字节为字符0(30H)
lpOutBuffer[3]='1'; // 第4个字节为字符1(31H)
lpOutBuffer[4]='0'; //第5个字节为字符0(30H)
lpOutBuffer[5]='1'; //第6个字节为字符1(31H)
lpOutBuffer[6]='\x03'; //第7个字节为字符ETX char *szBuffer = "^XA\n\r^RS8\n\r^RFR,H,0,8,2^FN1^FS^HV1,,8-byte Tag ID Data:^FS\n\r^XZ";
//从该段代码可以看出,仪表的通讯地址为001
DWORD dwBytesWrite=7;
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL bWriteStat;
ClearCommError(hCom,&dwErrorFlags,&ComStat);
bWriteStat=WriteFile(hCom,lpOutBuffer,dwBytesWrite,& dwBytesWrite,NULL);
if(!bWriteStat)
{
AfxMessageBox("写串口失败!");
} 读数据:
char str[100];
memset(str,'\0',100);
DWORD wCount=100;//读取的字节数
BOOL bReadStat;
bReadStat=ReadFile(hCom,str,wCount,&wCount,NULL);
if(!bReadStat)
AfxMessageBox("读串口失败!");
PurgeComm(hCom, PURGE_TXABORT|
PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
rrrr=str;
UpdateData(FALSE); 再者就是串口调试小助打开我的Com1的时候都会报错, 而我自己的程序代码却不会提示我打开串口失败,不知是何原因?(问题3)
hCom=CreateFile("COM2",//COM1口
GENERIC_READ|GENERIC_WRITE, //允许读和写
0, //独占方式
NULL,
OPEN_EXISTING, //打开而不是创建
0, //同步方式
NULL);
if(hCom==(HANDLE)-1)
{
AfxMessageBox("打开COM失败!");
return FALSE;
} SetupComm(hCom,100,100); //输入缓冲区和输出缓冲区的大小都是1024 COMMTIMEOUTS TimeOuts;
//设定读超时
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;
//在读一次输入缓冲区的内容后读操作就立即返回,
//而不管是否读入了要求的字符。
//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier=100;
TimeOuts.WriteTotalTimeoutConstant=500;
SetCommTimeouts(hCom,&TimeOuts); //设置超时 DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=9600; //波特率为9600
dcb.ByteSize=8; //每个字节有8位
dcb.Parity=NOPARITY; //无奇偶校验位
dcb.StopBits=TWOSTOPBITS; //两个停止位
SetCommState(hCom,&dcb); PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);还有一个菜鸟问题,我用writefile写到串口的数据,可以用readfile读出来码?还是只能读取设备返回的数据?
写数据:
char lpOutBuffer[7];
memset(lpOutBuffer,'\0',7); //前7个字节先清零
lpOutBuffer[0]='\x11'; //发送缓冲区的第1个字节为DC1
lpOutBuffer[1]='0'; //第2个字节为字符0(30H)
lpOutBuffer[2]='0'; //第3个字节为字符0(30H)
lpOutBuffer[3]='1'; // 第4个字节为字符1(31H)
lpOutBuffer[4]='0'; //第5个字节为字符0(30H)
lpOutBuffer[5]='1'; //第6个字节为字符1(31H)
lpOutBuffer[6]='\x03'; //第7个字节为字符ETX char *szBuffer = "^XA\n\r^RS8\n\r^RFR,H,0,8,2^FN1^FS^HV1,,8-byte Tag ID Data:^FS\n\r^XZ";
//从该段代码可以看出,仪表的通讯地址为001
DWORD dwBytesWrite=7;
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL bWriteStat;
ClearCommError(hCom,&dwErrorFlags,&ComStat);
bWriteStat=WriteFile(hCom,lpOutBuffer,dwBytesWrite,& dwBytesWrite,NULL);
if(!bWriteStat)
{
AfxMessageBox("写串口失败!");
} 读数据:
char str[100];
memset(str,'\0',100);
DWORD wCount=100;//读取的字节数
BOOL bReadStat;
bReadStat=ReadFile(hCom,str,wCount,&wCount,NULL);
if(!bReadStat)
AfxMessageBox("读串口失败!");
PurgeComm(hCom, PURGE_TXABORT|
PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
rrrr=str;
UpdateData(FALSE); 再者就是串口调试小助打开我的Com1的时候都会报错, 而我自己的程序代码却不会提示我打开串口失败,不知是何原因?(问题3)
hCom=CreateFile("COM2",//COM1口
GENERIC_READ|GENERIC_WRITE, //允许读和写
0, //独占方式
NULL,
OPEN_EXISTING, //打开而不是创建
0, //同步方式
NULL);
if(hCom==(HANDLE)-1)
{
AfxMessageBox("打开COM失败!");
return FALSE;
} SetupComm(hCom,100,100); //输入缓冲区和输出缓冲区的大小都是1024 COMMTIMEOUTS TimeOuts;
//设定读超时
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;
//在读一次输入缓冲区的内容后读操作就立即返回,
//而不管是否读入了要求的字符。
//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier=100;
TimeOuts.WriteTotalTimeoutConstant=500;
SetCommTimeouts(hCom,&TimeOuts); //设置超时 DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=9600; //波特率为9600
dcb.ByteSize=8; //每个字节有8位
dcb.Parity=NOPARITY; //无奇偶校验位
dcb.StopBits=TWOSTOPBITS; //两个停止位
SetCommState(hCom,&dcb); PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);还有一个菜鸟问题,我用writefile写到串口的数据,可以用readfile读出来码?还是只能读取设备返回的数据?
2、还有一个菜鸟问题,我用writefile写到串口的数据,可以用readfile读出来码?还是只能读取设备返回的数据?
//如果按照正确的连线接上设备,那么都能读到设备返回的数据。发送的内容可以用串口监视的程序查看。