int CKTXSerialPortCtrl::OpenCom(int iPort,int iBraudrate/*=115200*/,int iByteSize/*=8*/,int iParity/*=0*/ ,int iStopBits/*=1*/,int iContorl/*=0*/) { CMyMutex::CAutoLock lock(m_mutex); if(ERR_KEY != m_iFD) return KTX_SUCCESS; if(0==(iPort&0xFF)) return KTX_ERR; char csDevPath[100]={0}; if(iPort&0x0F00) sprintf(csDevPath,"/dev/ttyUSB%d",(iPort&0xFF)-1); else if(iPort&0xF000) sprintf(csDevPath,"/dev/ttySNX%d",(iPort&0xFF)-1); else sprintf(csDevPath,"/dev/ttyS%d",iPort-1); int iRet = KTX_ERR; m_iFD = open(csDevPath,O_RDWR|O_NOCTTY|O_NDELAY); if(m_iFD<0) return iRet; if(fcntl(m_iFD,F_SETFL,0)<0) { CloseCom(); return iRet; } setparms(m_iFD, iBraudrate, iParity, iByteSize, iStopBits, iContorl, iContorl); // SetSerialPort(m_iFD,iBraudrate,iByteSize,iParity,iStopBits,iContorl); return KTX_SUCCESS; }
int main() { unsigned char msb,lsb; int digi_val=5; //char s[256]; //int len; int i; OpenCom(); for(i=0;i<10000;i++){ // sending data //WriteComChar(0x42); WriteComChar(0x43); WriteComChar(0x41);//WriteCom("ABCDE", 5); Sleep(1); // receiving data //len = ReadCom(s, sizeof(s)-1); s[len] = 0; printf("%s\n", s); msb=ReadComChar(); lsb=ReadComChar(); //printf("%d\t",(int)msb); //printf("%d\t",(int)lsb); digi_val=(int)msb*256+(int)lsb; if (i%100==5) printf("%lf\n",digi_val*3.314/4096.0); //getchar(); } CloseCom(); printf("\nPress a key to exit"); getch(); return 0; }
bool SerialClass::OpenCom() { if(my_com_) { CloseCom(); } else { QString com_name_ = "/dev/ttySAC1"; my_com_ = new Posix_QextSerialPort(com_name_, QextSerialBase::Polling); } my_com_->open(QIODevice::ReadWrite); if(my_com_->isOpen()) { com_state_ = OPEN; my_com_->setBaudRate(BAUD115200); my_com_->setDataBits(DATA_8); my_com_->setParity(PAR_NONE); my_com_->setStopBits(STOP_1); my_com_->setFlowControl(FLOW_OFF); my_com_->setTimeout(50); } else { com_state_ = false; } return true; }
/**************************************************************************** *功能:释放com通信器 ****************************************************************************/ int ReleaseCOMCommunicator(Communicator* p) { if(p->m_nCommtype==COMM_COM) { p->m_nCommtype=NOT_CONNECT; EnterCriticalSection(&p->comConn->cs_initilize); if(p->comConn->reference<=0) { p->comConn->reference=0; LeaveCriticalSection(&p->comConn->cs_initilize); return SCERR_INVALID_COMM; } p->comConn->reference--; if(p->comConn->reference==0) { if(0!=CloseCom(p->comConn->comPort)) { // TRACE("reference:%d\n",p->comConn->reference); LeaveCriticalSection(&p->comConn->cs_initilize); return SCERR_OPERROR; } } LeaveCriticalSection(&p->comConn->cs_initilize); delete p; return SC_SUCCESS; } return SCERR_INVALID_COMM; }
CKTXSerialPortCtrl::~CKTXSerialPortCtrl() { if(m_iFD != ERR_KEY) { CloseCom(); m_iFD = ERR_KEY; } }
void SerialClass::ReleaseSerial() { if(my_com_) { CloseCom(); delete my_com_; my_com_ = 0; } }
BOOL ComIO::MainProc() { if(hCom == NULL) { OpenAndInitCom(); if(hCom == NULL) Sleep(10); } else { if(!Te.WaitForTimeOut()) { if(TaskMark & 0x01) { Wret = CommPort_Write(hCom, pWd); printf("Com Write:%s\r\n",pWd); TaskMark &= ~0x01; We.Set(); if(Wret == -1) { CloseCom(); } } if(TaskMark & 0x02) { Rret = CommPort_Read(hCom, pRb, Rbl); TaskMark &= ~0x02; Re.Set(); if(Rret == -1) { CloseCom(); } } } } return -1; }
ComRWTool::~ComRWTool(void) { try { CloseCom(); } catch (...) { } m_hComm = NULL; m_hQuitEvent = NULL; m_bOpen = false; m_pCache = NULL; m_iCacheLen = 0; }
//OpenPort------------------------------- //Initialize COM port, make stepper motor's current position home (0) //Input: None //Ouput: RS232 error code int zStepperDriver::OpenPort() { int RS232Error; char out[5]; char ptName[4]; //Initialize comm port CloseCom(prevPort); sprintf(ptName,"COM%i ",port); RS232Error = OpenComConfig (port, ptName, 9600, 0, 8, 1, 512, 512); SetXMode (port, 0); SetCTSMode (port, 1); SetComTime (port, 10); sprintf(out, "HM0\r"); ComWrt(port, out, strlen(out)); //set previous port as newly opened port prevPort = port; return RS232Error; }
int RKC_CommData ( int _ACT, int _ID, double *_Val) { int rLop = 0; int RTNval = 0; int BuffLEN = 0; char Buff[128]={0}; char BBC = 0x00; char dTRN[64] = {0}; static int Rs232Err = 0, NullPort = 0; switch (_ACT) { case Config: CloseCom(rkc.COM); if (Rs232Err = ReturnRS232Err (), Rs232Err < 0) return Rs232Err; OpenComConfig(rkc.COM, "", rkc.Baud, rkc.Pari, rkc.Dbit, rkc.Sbit, 512, 512); if (Rs232Err = ReturnRS232Err (), Rs232Err < 0) { NullPort = 1; return Rs232Err; } SetCTSMode(rkc.COM, rkc.Flc); if (Rs232Err = ReturnRS232Err (), Rs232Err < 0) return Rs232Err; SetComTime(rkc.COM, rkc.Tout); if (Rs232Err = ReturnRS232Err (), Rs232Err < 0) return Rs232Err; NullPort = 0; break; case getTP: Fmt(Buff, "%c%i[w2p0]%s[w2]%c", _EOT, (_ID & 0xFF), "M1", _ENQ); // MessagePopup("getTP",Buff); //DJ_Added_0502KB_12_57 break; case getSP: Fmt(Buff, "%c%i[w2p0]%s[w2]%c", _EOT, (_ID & 0xFF), "S1", _ENQ); break; case getAL1: Fmt(Buff, "%c%i[w2p0]%s[w2]%c", _EOT, (_ID & 0xFF), "A1", _ENQ); break; case getAL2: Fmt(Buff, "%c%i[w2p0]%s[w2]%c", _EOT, (_ID & 0xFF), "A2", _ENQ); break; case getAT: Fmt(Buff, "%c%i[w2p0]%s[w2]%c", _EOT, (_ID & 0xFF), "G1", _ENQ); break; case getST: Fmt(Buff, "%c%i[w2p0]%s[w2]%c", _EOT, (_ID & 0xFF), "G2", _ENQ); break; case setRUN: Fmt(Buff, "%c%i[w2p0]%c%s[w2]%f[p1]%c", _EOT, (_ID & 0xFF), _STX, "SR", *_Val, _ETX); break; case setSP: Fmt(Buff, "%c%i[w2p0]%c%s[w2]%f[p1]%c", _EOT, (_ID & 0xFF), _STX, "S1", *_Val, _ETX); break; case setAL1: Fmt(Buff, "%c%i[w2p0]%c%s[w2]%f[p1]%c", _EOT, (_ID & 0xFF), _STX, "A1", *_Val, _ETX); break; case setAL2: Fmt(Buff, "%c%i[w2p0]%c%s[w2]%f[p1]%c", _EOT, (_ID & 0xFF), _STX, "A2", *_Val, _ETX); break; case setAT: Fmt(Buff, "%c%i[w2p0]%c%s[w2]%f[p1]%c", _EOT, (_ID & 0xFF), _STX, "G1", *_Val, _ETX); break; case setST: Fmt(Buff, "%c%i[w2p0]%c%s[w2]%f[p1]%c", _EOT, (_ID & 0xFF), _STX, "G2", *_Val, _ETX); break; case setPB: Fmt(Buff, "%c%i[w2p0]%c%s[w2]%f[p1]%c", _EOT, (_ID & 0xFF), _STX, "PB", *_Val, _ETX); break; } if (NullPort) { *_Val = 0.00; } // Command Transfer Process if ((_ACT > 0x1F) && (NullPort == 0)) { // ========================================================= [ Set RKC Data ] // Flush Out Queue FlushOutQ (rkc.COM); Delay(0.5); // Count Buffer Length BuffLEN = StringLength (Buff); // Calc BBC BBC = 0x00; for (rLop=4; rLop < BuffLEN; rLop++) BBC ^= Buff[rLop]; // Append BBC Fmt ( Buff, "%s[a]<%c", BBC); BuffLEN +=1; // Sending Command ComWrt ( rkc.COM, Buff, BuffLEN); // Flush In Queue FlushInQ (rkc.COM); Delay(0.5); ComRd (rkc.COM, dTRN, 1); if (dTRN[0] == 0x06) RTNval = 0; // Sending OK else if (dTRN[0] == 0x15) RTNval = -10; // Sending Lost else RTNval = -1; // Connect Lost } else if ((_ACT > 0x0F) && (NullPort == 0)) { // ========================================================= [ Get RKC Data ] // Flush OUT Queue FlushOutQ (rkc.COM); Delay(0.5); // Send CMD ComWrt ( rkc.COM, Buff, 6); // Flush IN Queue FlushInQ (rkc.COM); Delay(0.5); // Receive CMD dTRN[0] = 0x00; ComRd (rkc.COM, dTRN, 11); Rs232Err = ReturnRS232Err(); if (ReturnRS232Err() == 0) Scan (dTRN ,"%s[i5]>%f", _Val); Delay(0.5); Fmt ( Buff, "%c%c", _EOT, 0x00); ComWrt (rkc.COM, Buff, 1); } return RTNval; }
ComIO::~ComIO() { CloseCom(); Terminate(); }
int ComRWTool::OpenCom(const char* pPort, int nBaudRate, int nParity, int nByteSize, int nStopBits) { if (m_bOpen) { return COMMUN_ERROR_OK; } if (pPort == NULL) { return COMMUN_ERROR_BAD_PARARM; } string strCom = pPort; if (strCom.find("\\\\.\\") == strCom.npos) { strCom = "\\\\.\\" + strCom; } if(m_hComm != NULL) { CloseHandle(m_hComm); m_hComm = NULL; } DCB dcb; // 串口控制块 COMMTIMEOUTS timeouts = { // 串口超时控制参数 100, // 读字符间隔超时时间: 100 ms 1, // 读操作时每字符的时间: 1 ms (n个字符总共为n ms) 500, // 基本的(额外的)读超时时间: 500 ms 1, // 写操作时每字符的时间: 1 ms (n个字符总共为n ms) 100}; // 基本的(额外的)写超时时间: 100 ms m_hComm = CreateFileA(strCom.c_str(), // 串口名称或设备路径 GENERIC_READ | GENERIC_WRITE, // 读写方式 0, // 共享方式:独占 NULL, // 默认的安全描述符 OPEN_EXISTING, // 创建方式 0, // 不需设置文件属性 NULL); // 不需参照模板文件 if(m_hComm == NULL || m_hComm == INVALID_HANDLE_VALUE) { CK_OutputDebugString("打开串口失败 err:%d",GetLastError()); return COMMUN_ERROR_FAIL; // 打开串口失败 } GetCommState(m_hComm, &dcb); // 取DCB dcb.BaudRate = nBaudRate; dcb.ByteSize = nByteSize; dcb.Parity = nParity; dcb.StopBits = nStopBits; SetCommState(m_hComm, &dcb); // 设置DCB SetupComm(m_hComm, 4096, 1024); // 设置输入输出缓冲区大小 SetCommTimeouts(m_hComm, &timeouts); // 设置超时 PurgeComm(m_hComm ,PURGE_TXCLEAR|PURGE_RXCLEAR); m_strPort = pPort; GetCommState(m_hComm, &dcb); m_hQuitEvent = CreateEvent(NULL,TRUE,FALSE,NULL); if (NULL == m_hQuitEvent) { CK_OutputDebugString("COM:Create m_hEventQuit failed!err:%d",GetLastError()); CloseCom(); return COMMUN_ERROR_HANDLE_FAILED; } m_bOpen = true; return COMMUN_ERROR_OK; }