// rs232.exe 串口控制台命令 // 编码 : 杨小卫 // EMail: yxw_@163.com // 日期 : 2011.2.20 #include "stdafx.h" #include <stdlib.h> #include "Serial/Serial.h" #define BUFF_SIZE 1024*4 #define u8 unsigned char static int hex2num(char c) { if (c >= '0' && c <= '9') return c - '0'; if (c >= 'a' && c <= 'f') return c - 'a' + 10; if (c >= 'A' && c <= 'F') return c - 'A' + 10; return -1; } static int hex2byte(const char *hex) { int a, b; a = hex2num(*hex++); if (a < 0) return -1; b = hex2num(*hex++); if (b < 0) return -1; return (a << 4) | b; } /** * hexstr2bin - Convert ASCII hex string into binary data * @hex: ASCII hex string (e.g., "01ab") * @buf: Buffer for the binary data * @len: Length of the text to convert in bytes (of buf); hex will be double * this size * Returns: 0 on success, -1 on failure (invalid hex string) */ int hexstr2bin(const char *hex, u8 *buf, size_t len) { size_t i; int a; const char *ipos = hex; u8 *opos = buf; for (i = 0; i < len; i++) { a = hex2byte(ipos); if (a < 0) return -1; *opos++ = a; ipos += 2; } return 0; } /* 参数说明: rs323.exe [-c ComPort-STRING default=COM1 ] [-b Baudrate={110,300,600,1200,2400,4800,9600,14400,19200,38400,56000,57600,115200,128000,256000} default=9600 ] [-l DataBits={5,6,7,8} default=8] [-s StopBit={1,1.5,2} default=1] [-p Parity={None,Odd,Even,Mark,Space} default=None] [-a ASCII-STRING] [-h HEX-STRING] */ int main(int argc, char* argv[]) { char szPort[20]="COM1"; CSerial::EBaudrate BaudRate=CSerial::EBaud9600; CSerial::EDataBits ByteSize=CSerial::EData8; CSerial::EParity Parity=CSerial::EParNone; CSerial::EStopBits StopBits=CSerial::EStop1; CSerial::EHandshake Handshake=CSerial::EHandshakeOff; CSerial com; DWORD in_len=0; DWORD out_len=0; u8 *in_ptr=NULL; u8 *out_ptr=NULL; int i=1; u8 *in_buff=NULL; u8 out_buff[BUFF_SIZE]; while (i<argc) { if (argv[i][0]=='-') { switch(argv[i][1]) { case 'c': case 'C': i++; if (i>=argc) break; if (argv[i][0]=='-') continue; if (strnicmp(argv[i],"COM",3)==0) { int nPort=atoi(&argv[i][0]+3); if (nPort>=255) return 0; itoa(nPort,szPort+3,10); } break; case 'b': case 'B': i++; if (i>=argc) break; if (argv[i][0]=='-') continue; BaudRate=(CSerial::EBaudrate)atoi(argv[i]); break; case 'l': case 'L': i++; if (i>=argc) break; if (argv[i][0]=='-') continue; ByteSize=(CSerial::EDataBits)atoi(argv[i]); if (ByteSize<CSerial::EData5 || ByteSize>CSerial::EData8) { ByteSize=CSerial::EData8; } break; case 's': case 'S': i++; if (i>=argc) break; if (argv[i][0]=='-') continue; if (stricmp(argv[i],"1")==0) { StopBits=CSerial::EStop1; }else if (stricmp(argv[i],"1.5")==0){ StopBits=CSerial::EStop1_5; }else if (stricmp(argv[i],"2")==0){ StopBits=CSerial::EStop2; } break; case 'p': case 'P': i++; if (i>=argc) break; if (argv[i][0]=='-') continue; if (stricmp(argv[i],"None")==0) { Parity=CSerial::EParNone; }else if (stricmp(argv[i],"Odd")==0){ Parity=CSerial::EParOdd; }else if (stricmp(argv[i],"Even")==0){ Parity=CSerial::EParOdd; }else if (stricmp(argv[i],"Mark")==0){ Parity=CSerial::EParOdd; }else if (stricmp(argv[i],"Space")==0){ Parity=CSerial::EParOdd; } break; case 'f': case 'F': i++; if (i>=argc) break; if (argv[i][0]=='-') continue; break; case 'a': case 'A': i++; if (i>=argc) break; if (argv[i][0]=='-') continue; in_len=strlen(argv[i]); in_ptr=(unsigned char *)argv[i]; break; case 'h': case 'H': { i++; if (i>=argc) break; if (argv[i][0]=='-') continue; in_len=strlen(argv[i])/2; in_buff=new unsigned char[in_len]; if (hexstr2bin(argv[i],in_buff,in_len)==ERROR_SUCCESS) { in_ptr=in_buff; } } break; } } i++; } if (in_len && in_ptr) { LONG lLastError = ERROR_SUCCESS; lLastError = com.Open(szPort,0,0,false); if (lLastError == ERROR_SUCCESS) { lLastError = com.Setup(BaudRate,ByteSize,Parity,StopBits); if (lLastError == ERROR_SUCCESS) { lLastError = com.SetupHandshaking(Handshake); if (lLastError == ERROR_SUCCESS) { LONG lLastError = ERROR_SUCCESS; lLastError = com.Write(in_ptr,in_len); if (lLastError == ERROR_SUCCESS) { printf("write ok/n"); com.Read(out_buff,BUFF_SIZE,&out_len); printf("result:%d/n",out_len); for (unsigned int i=0;i<out_len;i++) { printf("%02X",out_buff[i]); } } } } com.Close(); } } if (in_buff) delete in_buff; return 0; }