Windows: fixed OpenPort

This commit is contained in:
Cristian Maglie
2014-12-13 20:18:16 +04:30
parent fe9ccd37d9
commit 4095079d4b

View File

@@ -197,62 +197,69 @@ func (port windowsSerialPort) SetSpeed(baudrate int) error {
func OpenPort(portName string, useTIOCEXCL bool) (SerialPort, error) { func OpenPort(portName string, useTIOCEXCL bool) (SerialPort, error) {
portName = "\\\\.\\" + portName portName = "\\\\.\\" + portName
path, err := syscall.UTF16PtrFromString(portName)
handle, err := syscall.CreateFile(portName, syscall.GENERIC_READ|syscall.GENERIC_WRITE, 0, nil, syscall.OPEN_EXISTING, syscall.FILE_FLAG_OVERLAPPED, 0) if err != nil {
//handle := C.CreateFile(C.CString(portName), C.GENERIC_READ | C.GENERIC_WRITE, 0, 0, C.OPEN_EXISTING, C.FILE_FLAG_OVERLAPPED, 0) return nil, err
}
/* handle, err := syscall.CreateFile(
JNIEXPORT jlong JNICALL Java_jssc_SerialNativeInterface_openPort(JNIEnv *env, jobject object, jstring portName, jboolean useTIOCEXCL){ path,
char prefix[] = "\\\\.\\"; syscall.GENERIC_READ|syscall.GENERIC_WRITE,
const char* port = env->GetStringUTFChars(portName, JNI_FALSE); 0, nil,
syscall.OPEN_EXISTING,
//since 2.1.0 -> string concat fix 0, //syscall.FILE_FLAG_OVERLAPPED,
char portFullName[strlen(prefix) + strlen(port) + 1]; 0)
strcpy(portFullName, prefix); if err != nil {
strcat(portFullName, port); switch err {
//<- since 2.1.0 case syscall.ERROR_ACCESS_DENIED:
return nil, &SerialPortError{code: ERROR_PORT_BUSY}
HANDLE hComm = CreateFile(portFullName, case syscall.ERROR_FILE_NOT_FOUND:
GENERIC_READ | GENERIC_WRITE, return nil, &SerialPortError{code: ERROR_PORT_NOT_FOUND}
0,
0,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
0);
env->ReleaseStringUTFChars(portName, port);
*/
/*
if handle != syscall.INVALID_HANDLE_VALUE {
var dcb C.DCB
if C.GetCommState(handle, &dcb) != 0 {
C.CloseHandle(handle)
return nil,
}
} }
*/ return nil, err
/* //since 2.3.0 -> }
if(hComm != INVALID_HANDLE_VALUE){ // Create the serial port
DCB *dcb = new DCB(); port := &windowsSerialPort{
if(!GetCommState(hComm, dcb)){ Handle: handle,
CloseHandle(hComm);//since 2.7.0 }
hComm = (HANDLE)jssc_SerialNativeInterface_ERR_INCORRECT_SERIAL_PORT;//(-4)Incorrect serial port
}
delete dcb;
}
else {
DWORD errorValue = GetLastError();
if(errorValue == ERROR_ACCESS_DENIED){
hComm = (HANDLE)jssc_SerialNativeInterface_ERR_PORT_BUSY;//(-1)Port busy
}
else if(errorValue == ERROR_FILE_NOT_FOUND){
hComm = (HANDLE)jssc_SerialNativeInterface_ERR_PORT_NOT_FOUND;//(-2)Port not found
}
}
//<- since 2.3.0
return (jlong)hComm;//since 2.4.0 changed to jlong
};
*/ params := &DCB{}
err = GetCommState(port.Handle, params)
if err != nil {
port.Close()
return nil, &SerialPortError{code: ERROR_INVALID_SERIAL_PORT}
}
params.Flags |= DCB_RTS_CONTROL_ENABLE | DCB_DTR_CONTROL_ENABLE
params.Flags &= ^uint32(DCB_OUT_X_CTS_FLOW)
params.Flags &= ^uint32(DCB_OUT_X_DSR_FLOW)
params.Flags &= ^uint32(DCB_DSR_SENSITIVITY)
params.Flags |= DCB_TX_CONTINUE_ON_XOFF
params.Flags &= ^uint32(DCB_IN_X | DCB_OUT_X)
params.Flags &= ^uint32(DCB_ERROR_CHAR)
params.Flags &= ^uint32(DCB_NULL)
params.Flags &= ^uint32(DCB_ABORT_ON_ERROR)
params.XonLim = 2048
params.XoffLim = 512
params.XonChar = 17 // DC1
params.XoffChar = 19 // C3
err = SetCommState(port.Handle, params)
if err != nil {
port.Close()
return nil, &SerialPortError{code: ERROR_INVALID_SERIAL_PORT}
}
timeouts := &COMMTIMEOUTS{
ReadIntervalTimeout: 0xFFFFFFFF,
ReadTotalTimeoutMultiplier: 0xFFFFFFFF,
ReadTotalTimeoutConstant: 1000, // 1 sec
WriteTotalTimeoutConstant: 0,
WriteTotalTimeoutMultiplier: 0,
}
if err := SetCommTimeouts(port.Handle, timeouts); err != nil {
port.Close()
return nil, &SerialPortError{code: ERROR_INVALID_SERIAL_PORT}
}
return port, nil
} }
// vi:ts=2 // vi:ts=2