This avoids having to wait for the receiver to timeout before we can
open the same com port again.
This patch also adds a bit more debugging -- it prints Windows error
messages to stdout along with the file/line where the error was generated.
Signed-off-by: Keith Packard <keithp@keithp.com>
-altos_set_last_windows_error(void)
+_altos_set_last_windows_error(char *file, int line)
{
DWORD error = GetLastError();
TCHAR message[1024];
{
DWORD error = GetLastError();
TCHAR message[1024];
message,
sizeof (message) / sizeof (TCHAR),
NULL);
message,
sizeof (message) / sizeof (TCHAR),
NULL);
+ if (error != ERROR_SUCCESS)
+ printf ("%s:%d %s\n", file, line, message);
altos_set_last_error(error, message);
}
altos_set_last_error(error, message);
}
+#define altos_set_last_windows_error() _altos_set_last_windows_error(__FILE__, __LINE__)
+
PUBLIC struct altos_list *
altos_list_start(void)
{
PUBLIC struct altos_list *
altos_list_start(void)
{
if (!WriteFile(file->handle, data, used, &put, &file->ov_write)) {
if (GetLastError() != ERROR_IO_PENDING) {
altos_set_last_windows_error();
if (!WriteFile(file->handle, data, used, &put, &file->ov_write)) {
if (GetLastError() != ERROR_IO_PENDING) {
altos_set_last_windows_error();
+ printf ("\tflush write error\n");
return LIBALTOS_ERROR;
}
ret = WaitForSingleObject(file->ov_write.hEvent, INFINITE);
return LIBALTOS_ERROR;
}
ret = WaitForSingleObject(file->ov_write.hEvent, INFINITE);
case WAIT_OBJECT_0:
if (!GetOverlappedResult(file->handle, &file->ov_write, &put, FALSE)) {
altos_set_last_windows_error();
case WAIT_OBJECT_0:
if (!GetOverlappedResult(file->handle, &file->ov_write, &put, FALSE)) {
altos_set_last_windows_error();
+ printf ("\tflush result error\n");
return LIBALTOS_ERROR;
}
break;
default:
altos_set_last_windows_error();
return LIBALTOS_ERROR;
}
break;
default:
altos_set_last_windows_error();
+ printf ("\tflush wait error\n");
return LIBALTOS_ERROR;
}
}
return LIBALTOS_ERROR;
}
}
{
struct altos_file *file = calloc (1, sizeof (struct altos_file));
char full_name[64];
{
struct altos_file *file = calloc (1, sizeof (struct altos_file));
char full_name[64];
- DCB dcbSerialParams = {0};
COMMTIMEOUTS timeouts;
if (!file)
COMMTIMEOUTS timeouts;
if (!file)
FILE_FLAG_OVERLAPPED, NULL);
if (file->handle == INVALID_HANDLE_VALUE) {
altos_set_last_windows_error();
FILE_FLAG_OVERLAPPED, NULL);
if (file->handle == INVALID_HANDLE_VALUE) {
altos_set_last_windows_error();
+ printf ("cannot open %s\n", full_name);
free(file);
return NULL;
}
free(file);
return NULL;
}
timeouts.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(file->handle, &timeouts);
timeouts.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(file->handle, &timeouts);
- dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
- if (!GetCommState(file->handle, &dcbSerialParams)) {
- altos_set_last_windows_error();
- CloseHandle(file->handle);
- free(file);
- return NULL;
- }
- dcbSerialParams.BaudRate = CBR_9600;
- dcbSerialParams.ByteSize = 8;
- dcbSerialParams.StopBits = ONESTOPBIT;
- dcbSerialParams.Parity = NOPARITY;
- if (!SetCommState(file->handle, &dcbSerialParams)) {
- altos_set_last_windows_error();
- CloseHandle(file->handle);
- free(file);
- return NULL;
- }
-
if (file->handle != INVALID_HANDLE_VALUE) {
CloseHandle(file->handle);
file->handle = INVALID_HANDLE_VALUE;
if (file->handle != INVALID_HANDLE_VALUE) {
CloseHandle(file->handle);
file->handle = INVALID_HANDLE_VALUE;
+ SetEvent(file->ov_read.hEvent);
+ SetEvent(file->ov_write.hEvent);
+ CloseHandle(file->ov_read.hEvent);
+ CloseHandle(file->ov_write.hEvent);