📄 hw_serial.c
字号:
while((work = WaitForSingleObject(cb->Handle, INFINITE)) != WAIT_FAILED) { assert(work == WAIT_OBJECT_0); /* オブジェクトはシグナル觉轮になった */ ReadConsoleInput(stdin, &input_record, 1, &work); if(input_record.EventType == KEY_EVENT && input_record.Event.KeyEvent.bKeyDown == TRUE) { cb->ReceiveBuffer = (char)input_record.Event.KeyEvent.uChar.AsciiChar; BITSET(cb->Flag, SIO_STA_INTRCV); HALInterruptRequest(INHNO_SERIAL); } } return 0;}static void WinConsole_CreatePort(SIOPCB * cb){ BOOL result; result = AllocConsole(); FatalAssertion(result != 0, "WinConsole_CreatePort failed to allocate its own console."); cb->Handle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTitle("TOPPERS/JSP SerialConsole"); /* 减慨バッファ雌浑脱スレッドを侯喇 */ CreateThread(NULL,0,WinConsole_ReceiverThread,(LPVOID)cb,0,NULL);}static BOOL WinConsole_PutChar(SIOPCB * cb, INT chr, BOOL rasint){ BOOL result; DWORD written; char word; assert(cb != NULL); assert(BITTEST(cb->Flag, SIO_TYP_TTY)); assert(cb->Handle != NULL && cb->Handle != 0); /* 筛洁叫蜗に办矢机流慨 */ word = (char)chr; result = WriteFile(cb->Handle, &word, 1, &written, NULL); /* 充哈み券栏フラグが惟っていたら、流慨窗位充哈み妥滇を弹こす */ if(result != 0 && rasint == TRUE) { BITSET(cb->Flag, SIO_STA_INTSND); HALInterruptRequest(INHNO_SERIAL); } return result != 0 ? TRUE : FALSE;}static void WinConsole_ClosePort(SIOPCB * cb){ assert(cb != NULL); assert(BITTEST(cb->Flag, SIO_TYP_TTY)); if(cb->Handle != NULL && cb->Handle != 0) { FreeConsole(); cb->Handle = NULL; }}/*===========================================================================*//* * Windowsのコンソ〖ルを蝗脱したシリアル掐叫蜗 *//* 庙 : CreateConsoleScreenBufferは己窃箕にINVALID_HANDLE_VALUEを手すが、 戮のシリアル掐叫蜗婶と鼎奶かするためにNULLを脱いる。 */static DWORD WINAPI ScreenBuffer_ReceiverThread(LPVOID param){ SIOPCB * cb = (SIOPCB *)param; DWORD work; INPUT_RECORD input_record; assert(cb != NULL); assert(cb->Handle != NULL && cb->Handle != 0); while((work = WaitForSingleObject(cb->Handle, INFINITE)) != WAIT_FAILED) { assert(work == WAIT_OBJECT_0); /* オブジェクトはシグナル觉轮になった */ ReadConsoleInput(cb->Handle, &input_record, 1, &work); if(input_record.EventType == KEY_EVENT && input_record.Event.KeyEvent.bKeyDown == TRUE) { cb->ReceiveBuffer = (char)input_record.Event.KeyEvent.uChar.AsciiChar; BITSET(cb->Flag, SIO_STA_INTRCV); HALInterruptRequest(INHNO_SERIAL); } } return 0;}static void ScreenBuffer_CreatePort(SIOPCB * cb){ cb->Handle = CreateConsoleScreenBuffer(GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, CONSOLE_TEXTMODE_BUFFER, NULL); /* cb->Handle should not be compared with NULL because CreateConsoleScreenBuffer returns INVALID_HANDLE_VALUE if it failed */ FatalAssertion(cb->Handle != INVALID_HANDLE_VALUE && cb->Handle != NULL, "ScreenBuffer_CreatePort failed to allocate its own console."); SetConsoleActiveScreenBuffer(cb->Handle); SetConsoleTitle("TOPPERS/JSP SerialConsole"); /* 减慨バッファ雌浑脱スレッドを侯喇 */ CreateThread(NULL,0,ScreenBuffer_ReceiverThread,(LPVOID)cb,0,NULL);}static BOOL ScreenBuffer_PutChar(SIOPCB * cb, INT chr, BOOL rasint){ BOOL result; DWORD written; char word; assert(cb != NULL); assert(BITTEST(cb->Flag, SIO_TYP_SCRBUF)); assert(cb->Handle != NULL && cb->Handle != 0); /* 筛洁叫蜗に办矢机流慨 */ word = (char)chr; result = WriteFile(cb->Handle, &word, 1, &written, NULL); /* 充哈み券栏フラグが惟っていたら、流慨窗位充哈み妥滇を弹こす */ if(result != 0 && rasint == TRUE) { BITSET(cb->Flag, SIO_STA_INTSND); HALInterruptRequest(INHNO_SERIAL); } return result != 0 ? TRUE : FALSE;}static void ScreenBuffer_ClosePort(SIOPCB * cb){ assert(cb != NULL); assert(BITTEST(cb->Flag, SIO_TYP_SCRBUF)); if(cb->Handle != NULL && cb->Handle != 0) { CloseHandle(cb->Handle); cb->Handle = NULL; }}/*===========================================================================*//* * ほんとにシリアル叫蜗 */static DWORD WINAPI RawSerial_ReceiverThread(LPVOID param){ SIOPCB * cb = (SIOPCB *)param; DWORD work; char buffer; assert(cb != NULL); assert(cb->Handle != NULL && cb->Handle != 0); while((work = WaitForSingleObject(cb->Handle, INFINITE)) != WAIT_FAILED) { assert(work == WAIT_OBJECT_0); /* オブジェクトはシグナル觉轮になった */ ReadFile(cb->Handle, &buffer, 1, &work, NULL); cb->ReceiveBuffer = (char)buffer; BITSET(cb->Flag, SIO_STA_INTRCV); HALInterruptRequest(INHNO_SERIAL); } return 0;}static void RawSerial_CreatePort(SIOPCB * cb){ cb->Handle = CreateFile("COM1", GENERIC_READ|GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); FatalAssertion( cb->Handle != INVALID_HANDLE_VALUE && cb->Handle != NULL, "RawSerial_CreatePort failed to open the port 'COM1'."); /* 减慨バッファ雌浑脱スレッドを侯喇 */ CreateThread(NULL, 0, RawSerial_ReceiverThread, (LPVOID)cb, 0, NULL);}static BOOL RawSerial_PutChar(SIOPCB * cb, INT chr, BOOL rasint){ BOOL result; DWORD written; char word; assert(cb != NULL); assert(BITTEST(cb->Flag, SIO_TYP_RAWSIO)); assert(cb->Handle != NULL && cb->Handle != 0); /* 筛洁叫蜗に办矢机流慨 */ word = (char)chr; result = WriteFile(cb->Handle, &word, 1, &written, NULL); /* 充哈み券栏フラグが惟っていたら、流慨窗位充哈み妥滇を弹こす */ if(result != 0 && rasint == TRUE) { BITSET(cb->Flag, SIO_STA_INTSND); HALInterruptRequest(INHNO_SERIAL); } return result != 0 ? TRUE : FALSE;}static void RawSerial_ClosePort(SIOPCB * cb){ assert(cb != NULL); assert(BITTEST(cb->Flag, SIO_TYP_RAWSIO)); if(cb->Handle != NULL && cb->Handle != 0) { CloseHandle(cb->Handle); cb->Handle = NULL; }}/* * SIOドライバの介袋步ル〖チン */void sio_initialize(void){ int i; for(i=0; i<TNUM_PORT; ++i) { siopcb_table[i].Flag = SIO_TYP_CONSOLE; siopcb_table[i].Handle = NULL; siopcb_table[i].ReceiveBuffer = -1; siopcb_table[i].versatile = NULL; }}/* * シリアルI/Oポ〖トのオ〖プン */SIOPCB * sio_opn_por(ID siopid, VP_INT exinf){ BOOL success; SIOPCB * siopcb = GET_SIOPCB(siopid); assert(siopcb != NULL); siopcb->exinf = exinf; success = TRUE; switch(SIO_TYP(siopcb->Flag)) { case SIO_TYP_CONSOLE: HALExecuteProcedure(CreateSerialConsole,siopcb); break; case SIO_TYP_TTY: WinConsole_CreatePort(siopcb); break; case SIO_TYP_SCRBUF: HALExecuteProcedure(ScreenBuffer_CreatePort,siopcb); break; case SIO_TYP_RAWSIO: HALExecuteProcedure(RawSerial_CreatePort,siopcb); break; default: success = FALSE; } if(success == TRUE) BITSET(siopcb->Flag, SIO_STA_OPEN); return siopcb;}/* * シリアルI/Oポ〖トのクロ〖ズ */void sio_cls_por(SIOPCB *siopcb){ assert(siopcb != NULL); switch(SIO_TYP(siopcb->Flag)) { case SIO_TYP_CONSOLE: HALExecuteProcedure(SerialConsole_FinalRelease,siopcb); break; case SIO_TYP_TTY: WinConsole_ClosePort(siopcb); break; case SIO_TYP_SCRBUF: HALExecuteProcedure(ScreenBuffer_ClosePort,siopcb); break; case SIO_TYP_RAWSIO: HALExecuteProcedure(RawSerial_ClosePort,siopcb); break; }}/* * シリアルI/Oポ〖トへの矢机流慨 */BOOL sio_snd_chr(SIOPCB *siopcb, INT chr){ BOOL result; assert(siopcb != NULL); switch(SIO_TYP(siopcb->Flag)) { case SIO_TYP_CONSOLE: result = SerialConsole_PushChar(siopcb, chr); break; case SIO_TYP_TTY: result = WinConsole_PutChar(siopcb, chr, TRUE); break; case SIO_TYP_SCRBUF: result = ScreenBuffer_PutChar(siopcb, chr, TRUE); break; case SIO_TYP_RAWSIO: result = RawSerial_PutChar(siopcb, chr, TRUE); break; } return result;}/* * シリアルI/Oポ〖トからの矢机减慨 */INT sio_rcv_chr(SIOPCB * siopcb){ INT result; result = siopcb->ReceiveBuffer; siopcb->ReceiveBuffer = -1; return result;}/* * シリアルI/Oポ〖トからのコ〖ルバック钓材 */void sio_ena_cbr(SIOPCB * siopcb, UINT cbrtn){}/* * シリアルI/Oポ〖トからのコ〖ルバック敦贿 */void sio_dis_cbr(SIOPCB * siopcb, UINT cbrtn){}/* * シリアルI/Oポ〖ト充哈みハンドラ */void sio_handler(void){ int port; for(port = 0; port < TNUM_PORT; ++ port) { if(BITTEST(siopcb_table[port].Flag, SIO_STA_OPEN)) { /* 减慨窗位充哈み */ if(BITTEST(siopcb_table[port].Flag, SIO_STA_INTRCV)) { /* 减慨した矢机を艰り叫し */ BITCLEAR(siopcb_table[port].Flag, SIO_STA_INTRCV); sio_ierdy_rcv(GET_SIOPCB(ID_PORT(port))->exinf); } /* 流慨窗位充哈み */ if(BITTEST(siopcb_table[port].Flag, SIO_STA_INTSND)) { BITCLEAR(siopcb_table[port].Flag, SIO_STA_INTSND); sio_ierdy_snd(GET_SIOPCB(ID_PORT(port))->exinf); } } }}/* * コンソ〖ルポ〖トへの动扩办矢机叫蜗 (充哈みなし) */void SerialRawPutc(INT chr){ SIOPCB * siopcb = &siopcb_table[CONSOLE_PORTID - 1]; assert(siopcb != NULL); if(!BITTEST(siopcb->Flag, SIO_STA_OPEN)) return; switch(SIO_TYP(siopcb->Flag)) { case SIO_TYP_CONSOLE: SerialConsole_PutChar(siopcb, chr, FALSE); break; case SIO_TYP_TTY: WinConsole_PutChar(siopcb, chr, FALSE); break; case SIO_TYP_SCRBUF: ScreenBuffer_PutChar(siopcb, chr, FALSE); break; case SIO_TYP_RAWSIO: RawSerial_PutChar(siopcb, chr, FALSE); break; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -