int main(int argc, char **argv) { int max_val = 50; char desc[255]; data_bits bits; baud_bits baud; stop_bits stop; parity_bits parity; flow_control_type fc; #ifdef ALLEGRO_H allegro_init(); install_keyboard(); install_timer(); set_gfx_mode(GFX_TEXT, 0, 0, 0, 0); #endif dzcomm_init(); parse_command_line(argc, argv); // Will exit in this if command line requires it for (fc=DZ_MIN_CONTROL; fc<=DZ_MAX_CONTROL; fc++) { comm_port_set_flow_control(port1, fc); if (port2 != NULL) comm_port_set_flow_control(port2, fc); for (parity=DZ_MIN_PARITY; parity<=DZ_MAX_PARITY; parity++) { comm_port_set_parity(port1, parity); if (port2 != NULL) comm_port_set_parity(port2, parity); for (bits=DZ_MIN_DATA; bits<=DZ_MAX_DATA; bits++) { comm_port_set_data_bits(port1, bits); if (port2 != NULL) comm_port_set_data_bits(port2, bits); for (baud=DZ_MIN_BAUD; baud<=DZ_MAX_BAUD; baud++) { comm_port_set_baud_rate(port1, baud); if (port2 != NULL) comm_port_set_baud_rate(port2, baud); max_val = 1 << num_data_bits[bits]; for (stop=DZ_MIN_STOP; stop<=DZ_MAX_STOP; stop++) { comm_port_set_stop_bits(port1, stop); if (port2 != NULL) comm_port_set_stop_bits(port2, stop); sprintf(desc, "(%s parity, %s control. bits:%d baud:%6d stop:%d):", parity_desc[parity], flow_control_desc[fc], num_data_bits[bits], baud_from_baud_bits[baud], num_stop_bits[stop]); if (main_loop(desc, max_val) == -1) exit(0); } } } } } return 0; }
int open_comport() { #ifdef ALLEGRO_WINDOWS DCB dcb; COMMTIMEOUTS timeouts; DWORD bytes_written; char temp_str[16]; #endif if (comport.status == READY) // if the comport is open, close_comport(); // close it #ifdef ALLEGRO_WINDOWS // Naming of serial ports 10 and higher: See // http://www.connecttech.com/KnowledgeDatabase/kdb227.htm // http://support.microsoft.com/?id=115831 sprintf(temp_str, "\\\\.\\COM%i", comport.number + 1); com_port = CreateFile(temp_str, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); if (com_port == INVALID_HANDLE_VALUE) { comport.status = NOT_OPEN; //port was not open return -1; // return error } // Setup comport GetCommState(com_port, &dcb); dcb.BaudRate = comport.baud_rate; dcb.ByteSize = 8; dcb.StopBits = ONESTOPBIT; dcb.fParity = FALSE; dcb.Parity = NOPARITY; dcb.fOutxCtsFlow = FALSE; dcb.fOutxDsrFlow = FALSE; dcb.fOutX = FALSE; dcb.fInX = FALSE; dcb.fDtrControl = DTR_CONTROL_ENABLE; dcb.fRtsControl = RTS_CONTROL_ENABLE; dcb.fDsrSensitivity = FALSE; dcb.fErrorChar = FALSE; dcb.fAbortOnError = FALSE; SetCommState(com_port, &dcb); // Setup comm timeouts timeouts.ReadIntervalTimeout = MAXWORD; timeouts.ReadTotalTimeoutMultiplier = 0; timeouts.ReadTotalTimeoutConstant = 0; timeouts.WriteTotalTimeoutMultiplier = TX_TIMEOUT_MULTIPLIER; timeouts.WriteTotalTimeoutConstant = TX_TIMEOUT_CONSTANT; SetCommTimeouts(com_port, &timeouts); // Hack to get around Windows 2000 multiplying timeout values by 15 GetCommTimeouts(com_port, &timeouts); if (TX_TIMEOUT_MULTIPLIER > 0) timeouts.WriteTotalTimeoutMultiplier = TX_TIMEOUT_MULTIPLIER * TX_TIMEOUT_MULTIPLIER / timeouts.WriteTotalTimeoutMultiplier; if (TX_TIMEOUT_CONSTANT > 0) timeouts.WriteTotalTimeoutConstant = TX_TIMEOUT_CONSTANT * TX_TIMEOUT_CONSTANT / timeouts.WriteTotalTimeoutConstant; SetCommTimeouts(com_port, &timeouts); // If the port is Bluetooth, make sure device is active PurgeComm(com_port, PURGE_TXCLEAR|PURGE_RXCLEAR); WriteFile(com_port, "?\r", 2, &bytes_written, 0); if (bytes_written != 2) // If Tx timeout occured { PurgeComm(com_port, PURGE_TXCLEAR|PURGE_RXCLEAR); CloseHandle(com_port); comport.status = NOT_OPEN; //port was not open return -1; } #elif TERMIOS char tmp[54]; if( comport.number < 100 ) snprintf(tmp, sizeof(tmp), "/dev/ttyS%d", comport.number); else snprintf(tmp, sizeof(tmp), "/dev/ttyUSB%d", comport.number-100); fdtty = open( tmp, O_RDWR | O_NOCTTY ); if (fdtty <0) { return(-1); } tcgetattr(fdtty,&oldtio); /* save current port settings */ bzero(&newtio, sizeof(newtio)); cfsetspeed(&newtio, comport.baud_rate); cfmakeraw(&newtio); newtio.c_cflag |= (CLOCAL | CREAD); // No parity (8N1): newtio.c_cflag &= ~PARENB; newtio.c_cflag &= ~CSTOPB; newtio.c_cflag &= ~CSIZE; newtio.c_cflag |= CS8; // disable hardware flow control newtio.c_cflag &= ~CRTSCTS ; newtio.c_cc[VTIME] = 0; /* inter-character timer unused */ newtio.c_cc[VMIN] = 0; /* blocking read until 5 chars received */ tcflush(fdtty, TCIFLUSH); tcsetattr(fdtty,TCSANOW,&newtio); #else com_port = comm_port_init(comport.number); if (!com_port) { write_log(szDZCommErr); comport.status = NOT_OPEN; return -1; } comm_port_set_baud_rate(com_port, comport.baud_rate); comm_port_set_parity(com_port, NO_PARITY); comm_port_set_data_bits(com_port, BITS_8); comm_port_set_stop_bits(com_port, STOP_1); comm_port_set_flow_control(com_port, NO_CONTROL); if (comm_port_install_handler(com_port) != 1) { write_log(szDZCommErr); comport.status = NOT_OPEN; //port was not open return -1; // return error } #endif serial_time_out = FALSE; comport.status = READY; return 0; // everything is okay }
int open_comport() { #ifdef ALLEGRO_WINDOWS DCB dcb; COMMTIMEOUTS timeouts; char temp_str[16]; #endif if (comport.status == READY) // if the comport is open, close_comport(); // close it #ifdef ALLEGRO_WINDOWS sprintf(temp_str, "COM%i", comport.number + 1); com_port = CreateFile(temp_str, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); if (com_port == INVALID_HANDLE_VALUE) { comport.status = NOT_OPEN; //port was not open return -1; // return error } GetCommState(com_port, &dcb); dcb.BaudRate = comport.baud_rate; dcb.ByteSize = 8; dcb.StopBits = ONESTOPBIT; dcb.fParity = FALSE; dcb.Parity = NOPARITY; dcb.fOutxCtsFlow = FALSE; dcb.fOutxDsrFlow = FALSE; dcb.fOutX = FALSE; dcb.fInX = FALSE; dcb.fDtrControl = DTR_CONTROL_ENABLE; dcb.fRtsControl = RTS_CONTROL_ENABLE; dcb.fDsrSensitivity = FALSE; dcb.fErrorChar = FALSE; dcb.fAbortOnError = FALSE; SetCommState(com_port, &dcb); timeouts.ReadIntervalTimeout = MAXWORD; timeouts.ReadTotalTimeoutMultiplier = 0; timeouts.ReadTotalTimeoutConstant = 0; timeouts.WriteTotalTimeoutMultiplier = 0; timeouts.WriteTotalTimeoutConstant = 0; SetCommTimeouts(com_port, &timeouts); #else com_port = comm_port_init(comport.number); comm_port_set_baud_rate(com_port, comport.baud_rate); comm_port_set_parity(com_port, NO_PARITY); comm_port_set_data_bits(com_port, BITS_8); comm_port_set_stop_bits(com_port, STOP_1); comm_port_set_flow_control(com_port, NO_CONTROL); if (comm_port_install_handler(com_port) != 1) { comport.status = NOT_OPEN; //port was not open return -1; // return error } #endif serial_time_out = FALSE; comport.status = READY; return 0; // everything is okay }
int open_comport() { #ifdef ALLEGRO_WINDOWS DCB dcb; COMMTIMEOUTS timeouts; DWORD bytes_written; char temp_str[16]; #endif if (comport.status == READY) // if the comport is open, close_comport(); // close it #ifdef ALLEGRO_WINDOWS // Naming of serial ports 10 and higher: See // http://www.connecttech.com/KnowledgeDatabase/kdb227.htm // http://support.microsoft.com/?id=115831 sprintf(temp_str, "\\\\.\\COM%i", comport.number + 1); com_port = CreateFile(temp_str, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); if (com_port == INVALID_HANDLE_VALUE) { comport.status = NOT_OPEN; //port was not open return -1; // return error } // Setup comport GetCommState(com_port, &dcb); dcb.BaudRate = comport.baud_rate; dcb.ByteSize = 8; dcb.StopBits = ONESTOPBIT; dcb.fParity = FALSE; dcb.Parity = NOPARITY; dcb.fOutxCtsFlow = FALSE; dcb.fOutxDsrFlow = FALSE; dcb.fOutX = FALSE; dcb.fInX = FALSE; dcb.fDtrControl = DTR_CONTROL_ENABLE; dcb.fRtsControl = RTS_CONTROL_ENABLE; dcb.fDsrSensitivity = FALSE; dcb.fErrorChar = FALSE; dcb.fAbortOnError = FALSE; SetCommState(com_port, &dcb); // Setup comm timeouts timeouts.ReadIntervalTimeout = MAXWORD; timeouts.ReadTotalTimeoutMultiplier = 0; timeouts.ReadTotalTimeoutConstant = 0; timeouts.WriteTotalTimeoutMultiplier = TX_TIMEOUT_MULTIPLIER; timeouts.WriteTotalTimeoutConstant = TX_TIMEOUT_CONSTANT; SetCommTimeouts(com_port, &timeouts); // Hack to get around Windows 2000 multiplying timeout values by 15 GetCommTimeouts(com_port, &timeouts); if (TX_TIMEOUT_MULTIPLIER > 0) timeouts.WriteTotalTimeoutMultiplier = TX_TIMEOUT_MULTIPLIER * TX_TIMEOUT_MULTIPLIER / timeouts.WriteTotalTimeoutMultiplier; if (TX_TIMEOUT_CONSTANT > 0) timeouts.WriteTotalTimeoutConstant = TX_TIMEOUT_CONSTANT * TX_TIMEOUT_CONSTANT / timeouts.WriteTotalTimeoutConstant; SetCommTimeouts(com_port, &timeouts); // If the port is Bluetooth, make sure device is active PurgeComm(com_port, PURGE_TXCLEAR|PURGE_RXCLEAR); WriteFile(com_port, "?\r", 2, &bytes_written, 0); if (bytes_written != 2) // If Tx timeout occured { PurgeComm(com_port, PURGE_TXCLEAR|PURGE_RXCLEAR); CloseHandle(com_port); comport.status = NOT_OPEN; //port was not open return -1; } #else com_port = comm_port_init(comport.number); comm_port_set_baud_rate(com_port, comport.baud_rate); comm_port_set_parity(com_port, NO_PARITY); comm_port_set_data_bits(com_port, BITS_8); comm_port_set_stop_bits(com_port, STOP_1); comm_port_set_flow_control(com_port, NO_CONTROL); if (comm_port_install_handler(com_port) != 1) { comport.status = NOT_OPEN; //port was not open return -1; // return error } #endif serial_time_out = FALSE; comport.status = READY; return 0; // everything is okay }