RBAPI(bool) com_Send(int com, unsigned char* buf, int bsize) { unsigned long nowtime; int numbytes = 0, bsize2; if (COM_duplex[com] == COM_HDUPLEX_RTS) { MPOS_Start(); set_rts(com); } while (bsize > 0) { bsize2 = (bsize <= MAXRWSIZE)? bsize : MAXRWSIZE; for (nowtime = timer_nowtime(); bsize2 > 0; buf += numbytes, bsize2 -= numbytes, bsize -= numbytes) { #if defined(RB_MSVC_WIN32) || defined(RB_MSVC_WINCE) if (WriteFile(COM_info[com].fp, buf, bsize2, (LPDWORD)&numbytes, NULL) == FALSE) { err_SetMsg(ERROR_COM_SENDFAIL, "WriteFile() fails"); goto SEND_FAIL; } #elif defined(RB_LINUX) if ((numbytes = write(COM_info[com].fp, buf, bsize2)) < 0) { err_SetMsg(ERROR_COM_SENDFAIL, "write() fails"); goto SEND_FAIL; } #else // TODO ... err_SetMsg(ERROR_COM_INVALID, "unsupported platform"); goto SEND_FAIL; #endif if ((timer_nowtime() - nowtime) > COM_TIMEOUT) { err_SetMsg(ERROR_COM_SENDFAIL, "time-out to write bytes"); goto SEND_FAIL; } } // for (nowtime... } // end while (bsize... if (COM_duplex[com] == COM_HDUPLEX_RTS) { com_FlushWFIFO(com); clear_rts(com); MPOS_End(); } return true; SEND_FAIL: if (COM_duplex[com] == COM_HDUPLEX_RTS) { clear_rts(com); MPOS_End(); } return false; }
RBAPI(void) com_Close(int com) { if(com_InUse(com) == false) return; com_FlushWFIFO(com); com_ClearRFIFO(com); #if defined(RB_MSVC_WIN32) || defined(RB_MSVC_WINCE) SetCommTimeouts(COM_info[com].fp, &COM_info[com].oldtimeouts); SetCommState(COM_info[com].fp, &(COM_info[com].oldstate)); CloseHandle(COM_info[com].fp); #elif defined(RB_LINUX) tcsetattr(COM_info[com].fp, TCSANOW, &(COM_info[com].oldstate)); close(COM_info[com].fp); #endif if (COM_oldTMode[com] == true) com_EnableTurboMode(com); else com_DisableTurboMode(com); if (COM_oldFMode[com] == true) com_EnableFIFO32(com); else com_DisableFIFO32(com); io_Close(COM_ioSection[com]); COM_ioSection[com] = -1; }