📄 mode.c
字号:
{
TCHAR szPortName[MAX_PORTNAME_LEN];
TCHAR szTargetPath[MAX_PORTNAME_LEN];
_stprintf(szPortName, _T("LPT%d"), nPortNum);
_stprintf(szTargetPath, _T("COM%d"), nPortNum);
if (!DefineDosDevice(DDD_REMOVE_DEFINITION, szPortName, szTargetPath)) {
DWORD error = GetLastError();
_tprintf(_T("SetParallelState(%d) - DefineDosDevice(%s) failed: 0x%lx\n"), nPortNum, szPortName, error);
}
return 0;
}
/*
\??\COM1
\Device\NamedPipe\Spooler\LPT1
BOOL DefineDosDevice(
DWORD dwFlags, // options
LPCTSTR lpDeviceName, // device name
LPCTSTR lpTargetPath // path string
);
DWORD QueryDosDevice(
LPCTSTR lpDeviceName, // MS-DOS device name string
LPTSTR lpTargetPath, // query results buffer
DWORD ucchMax // maximum size of buffer
);
*/
int SetConsoleState()
{
/*
"Select code page: MODE CON[:] CP SELECT=yyy",
"Code page status: MODE CON[:] CP [/STATUS]",
"Display mode: MODE CON[:] [COLS=c] [LINES=n]",
"Typematic rate: MODE CON[:] [RATE=r DELAY=d]",
*/
return 0;
}
static
int ExtractModeSerialParams(const TCHAR* param)
{
if ( _tcsstr(param, _T("OFF"))) {
return 0;
} else if (_tcsstr(param, _T("ON"))) {
return 1;
} else if (_tcsstr(param, _T("HS"))) {
return 2;
} else if (_tcsstr(param, _T("TG"))) {
return 3;
}
return -1;
}
int SetSerialState(int nPortNum, int args, TCHAR *argv[])
{
int arg;
int value;
DCB dcb;
COMMTIMEOUTS CommTimeouts;
TCHAR buf[MAX_COMPARAM_LEN+1];
if (SerialPortQuery(nPortNum, &dcb, &CommTimeouts, FALSE)) {
for (arg = 2; arg < args; arg++) {
if (_tcslen(argv[arg]) > MAX_COMPARAM_LEN) {
_tprintf(_T("Invalid parameter (too long) - %s\n"), argv[arg]);
return 1;
}
_tcscpy(buf, argv[arg]);
_tcslwr(buf);
if (_tcsstr(buf, _T("baud="))) {
_tscanf(buf+5, "%lu", &dcb.BaudRate);
} else if (_tcsstr(buf, _T("parity="))) {
if (_tcschr(buf, 'D')) {
dcb.Parity = 1;
} else if (_tcschr(buf, 'V')) {
dcb.Parity = 2;
} else if (_tcschr(buf, 'M')) {
dcb.Parity = 3;
} else if (_tcschr(buf, 'S')) {
dcb.Parity = 4;
} else {
dcb.Parity = 0;
}
} else if (_tcsstr(buf, _T("data="))) {
_tscanf(buf+5, "%lu", &dcb.ByteSize);
} else if (_tcsstr(buf, _T("stop="))) {
if (_tcschr(buf, '5')) {
dcb.StopBits = 1;
} else if (_tcschr(buf, '2')) {
dcb.StopBits = 2;
} else {
dcb.StopBits = 0;
}
} else if (_tcsstr(buf, _T("to="))) { // to=on|off
value = ExtractModeSerialParams(buf);
if (value != -1) {
} else {
goto invalid_serial_parameter;
}
} else if (_tcsstr(buf, _T("xon="))) { // xon=on|off
value = ExtractModeSerialParams(buf);
if (value != -1) {
dcb.fOutX = value;
dcb.fInX = value;
} else {
goto invalid_serial_parameter;
}
} else if (_tcsstr(buf, _T("odsr="))) { // odsr=on|off
value = ExtractModeSerialParams(buf);
if (value != -1) {
dcb.fOutxDsrFlow = value;
} else {
goto invalid_serial_parameter;
}
} else if (_tcsstr(buf, _T("octs="))) { // octs=on|off
value = ExtractModeSerialParams(buf);
if (value != -1) {
dcb.fOutxCtsFlow = value;
} else {
goto invalid_serial_parameter;
}
} else if (_tcsstr(buf, _T("dtr="))) { // dtr=on|off|hs
value = ExtractModeSerialParams(buf);
if (value != -1) {
dcb.fDtrControl = value;
} else {
goto invalid_serial_parameter;
}
} else if (_tcsstr(buf, _T("rts="))) { // rts=on|off|hs|tg
value = ExtractModeSerialParams(buf);
if (value != -1) {
dcb.fRtsControl = value;
} else {
goto invalid_serial_parameter;
}
} else if (_tcsstr(buf, _T("idsr="))) { // idsr=on|off
value = ExtractModeSerialParams(buf);
if (value != -1) {
dcb.fDsrSensitivity = value;
} else {
goto invalid_serial_parameter;
}
} else {
invalid_serial_parameter:;
_tprintf(_T("Invalid parameter - %s\n"), buf);
return 1;
}
}
SerialPortQuery(nPortNum, &dcb, &CommTimeouts, TRUE);
}
return 0;
}
int find_portnum(const TCHAR* cmdverb)
{
int portnum = -1;
if (cmdverb[3] >= '0' && cmdverb[3] <= '9') {
portnum = cmdverb[3] - '0';
if (cmdverb[4] >= '0' && cmdverb[4] <= '9') {
portnum *= 10;
portnum += cmdverb[4] - '0';
}
}
return portnum;
}
int main(int argc, TCHAR *argv[])
{
int nPortNum;
TCHAR param1[MAX_COMPARAM_LEN+1];
TCHAR param2[MAX_COMPARAM_LEN+1];
if (argc > 1) {
if (_tcslen(argv[1]) > MAX_COMPARAM_LEN) {
_tprintf(_T("Invalid parameter (too long) - %s\n"), argv[1]);
return 1;
}
_tcscpy(param1, argv[1]);
_tcslwr(param1);
if (argc > 2) {
if (_tcslen(argv[2]) > MAX_COMPARAM_LEN) {
_tprintf(_T("Invalid parameter (too long) - %s\n"), argv[2]);
return 1;
}
_tcscpy(param2, argv[2]);
_tcslwr(param2);
} else {
param2[0] = '\0';
}
if (_tcsstr(param1, _T("/?")) || _tcsstr(param1, _T("-?"))) {
return Usage();
} else if (_tcsstr(param1, _T("/status"))) {
goto show_status;
} else if (_tcsstr(param1, _T("lpt"))) {
nPortNum = find_portnum(param1);
if (nPortNum != -1)
return ShowParallelStatus(nPortNum);
} else if (_tcsstr(param1, _T("con"))) {
return ShowConsoleStatus();
} else if (_tcsstr(param1, _T("com"))) {
nPortNum = find_portnum(param1);
if (nPortNum != -1) {
if (param2[0] == '\0' || _tcsstr(param2, _T("/status"))) {
return ShowSerialStatus(nPortNum);
} else {
return SetSerialState(nPortNum, argc, argv);
}
}
}
_tprintf(_T("Invalid parameter - %s\n"), param1);
return 1;
} else {
show_status:;
QueryDevices();
/*
ShowParallelStatus(1);
for (nPortNum = 0; nPortNum < MAX_COMPORT_NUM; nPortNum++) {
ShowSerialStatus(nPortNum + 1);
}
ShowConsoleStatus();
*/
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -