|
Сорректное хакрытие ComPort
|
|||
---|---|---|---|
#18+
Добрый день. Не могу побороть одну проблему. Имеется некая железка которая работает через ComPort корректно получается работать c ComPort только через winApi То есть CreateFile, ReadFile, WriteFile Все работает нормально, пока не дошло дело до закрытия порта То есть вызвать CloseHandle и тут наступает тормоз. Теперь по порядку как работает логика. Открываю порт и сразу же запускаю на чтение (ожидаю данные), как только данные пришли, обработал их в ответ шлю на железку необходимые данные, и опять останавливаюсь на чтение. Нужно организовать закрытие порта, а то получается что когда запускаю Closehandle программа ждет хотя бы один байт с порта. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 14:27 |
|
Сорректное хакрытие ComPort
|
|||
---|---|---|---|
#18+
PurgeComm звал? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 14:58 |
|
Сорректное хакрытие ComPort
|
|||
---|---|---|---|
#18+
Вызывал не помогает Вот метод на закрытие public void Close() { Purge(15); if (IsOpen()) { bool t =CloseHandle(hPortHandle); } } ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 15:10 |
|
Сорректное хакрытие ComPort
|
|||
---|---|---|---|
#18+
Метод purge выглядит так public void Purge(int Flag) { PurgeComm(hPortHandle, Flag); } ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 15:11 |
|
Сорректное хакрытие ComPort
|
|||
---|---|---|---|
#18+
Вячеслав Д, таймауты выставлял? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 15:16 |
|
Сорректное хакрытие ComPort
|
|||
---|---|---|---|
#18+
Да, и таймауты выставлял тоже не помогло вот код для открытия public bool Open() { //Открытие порта hPortHandle = CreateFile(PortNum, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); COMMTIMEOUTS tm = new COMMTIMEOUTS(); if (!GetCommTimeouts(hPortHandle, ref tm)) return false; tm.ReadIntervalTimeout = 600; SetCommTimeouts(hPortHandle, ref tm); if (hPortHandle == INVALID_HANDLE_VALUE) { return false; } //Настройка порта DCB dcbCommPort = new DCB(); GetCommState(hPortHandle, ref dcbCommPort); dcbCommPort.BaudRate = BaudRate; dcbCommPort.Parity = (byte)parity; dcbCommPort.ByteSize = ByteSize; dcbCommPort.StopBits = (byte)stopBits; return SetCommState(hPortHandle, ref dcbCommPort); } ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 15:23 |
|
Сорректное хакрытие ComPort
|
|||
---|---|---|---|
#18+
Так ребята. Большой спасибо, похоже да Вы были правы, дело в таймаутах было, сейчас корректно обработаю, должно быть нормально. О результатах чуть позже отпишусь. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 15:29 |
|
Сорректное хакрытие ComPort
|
|||
---|---|---|---|
#18+
Вячеслав ДИмеется некая железка которая работает через ComPort корректно получается работать c ComPort только через winApi . А почему с SerialPort не работает-то? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 15:31 |
|
Сорректное хакрытие ComPort
|
|||
---|---|---|---|
#18+
Pallaris, Да, как бы сказать есть некая железяка и рабочий софт, и все больше ничего нету, надо переписать на шарп и уже данные хранить не в парадоксовской базе а на сервере mssql. но это уже реализовано, а вот запнулся при получении данных. Попробовал использовать SerialPort, после того как открываю порт через фреймворк, потом закрываю его, перестает работать старое ПО, помогает только перезагрузка компа, никакой технической информации нету, что надо получить, что надо передать. Помогла программулинка ComPortMonitor, которая вешается на уже открытый порт и слушает его, это была зацепка, так вот когда открываешь через winApi и через SerialPort совсем большая разница в этом мониторе по поводу открытия порта. Вот почему начал использовать winapi ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 15:39 |
|
Сорректное хакрытие ComPort
|
|||
---|---|---|---|
#18+
Вячеслав ДPallaris, Да, как бы сказать есть некая железяка и рабочий софт, и все больше ничего нету, надо переписать на шарп и уже данные хранить не в парадоксовской базе а на сервере mssql. но это уже реализовано, а вот запнулся при получении данных. Попробовал использовать SerialPort, после того как открываю порт через фреймворк, потом закрываю его, перестает работать старое ПО, помогает только перезагрузка компа, никакой технической информации нету, что надо получить, что надо передать. Помогла программулинка ComPortMonitor, которая вешается на уже открытый порт и слушает его, это была зацепка, так вот когда открываешь через winApi и через SerialPort совсем большая разница в этом мониторе по поводу открытия порта. Вот почему начал использовать winapiКак интересно и какая разница? Выслал бы чо там и там монитор, наманиторил. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 16:16 |
|
Сорректное хакрытие ComPort
|
|||
---|---|---|---|
#18+
fortibransa, Так конечно, пятница, вечер, проверять уже с понедельника буду, но то что отобразил монитор могу показать. Вот открытие порта и ожидание приема данных от железки на старом ПО IRP_MJ_CREATE Nmserial1 SUCCESS Options: Open IOCTL_SERIAL_GET_BAUD_RATE Nmserial1 SUCCESS IOCTL_SERIAL_GET_LINE_CONTROL Nmserial1 SUCCESS IOCTL_SERIAL_GET_CHARS Nmserial1 SUCCESS IOCTL_SERIAL_GET_HANDFLOW Nmserial1 SUCCESS IOCTL_SERIAL_GET_BAUD_RATE Nmserial1 SUCCESS IOCTL_SERIAL_GET_LINE_CONTROL Nmserial1 SUCCESS IOCTL_SERIAL_GET_CHARS Nmserial1 SUCCESS IOCTL_SERIAL_GET_HANDFLOW Nmserial1 SUCCESS IOCTL_SERIAL_SET_BAUD_RATE Nmserial1 SUCCESS Rate: 9600 IOCTL_SERIAL_SET_RTS Nmserial1 SUCCESS IOCTL_SERIAL_SET_DTR Nmserial1 SUCCESS IOCTL_SERIAL_SET_LINE_CONTROL Nmserial1 SUCCESS StopBits: ERROR Parity: NONE WordLength: 8 IOCTL_SERIAL_SET_CHAR Nmserial1 SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13 IOCTL_SERIAL_SET_HANDFLOW Nmserial1 SUCCESS Shake:1 Replace:40 XonLimit:2048 XoffLimit:512 IOCTL_SERIAL_PURGE Nmserial1 SUCCESS Purge: TXABORT RXABORT TXCLEAR RXCLEAR IRP_MJ_READ Nmserial1 Length 183 А вот что происходит когда открываю через объект SerialPort вот пример это после следующих строк Код: c# 1. 2.
такое происходит IRP_MJ_CREATE Nmserial1 SUCCESS Options: Open IOCTL_SERIAL_GET_PROPERTIES Nmserial1 SUCCESS IOCTL_SERIAL_GET_MODEMSTATUS Nmserial1 SUCCESS IOCTL_SERIAL_GET_BAUD_RATE Nmserial1 SUCCESS IOCTL_SERIAL_GET_LINE_CONTROL Nmserial1 SUCCESS IOCTL_SERIAL_GET_CHARS Nmserial1 SUCCESS IOCTL_SERIAL_GET_HANDFLOW Nmserial1 SUCCESS IOCTL_SERIAL_GET_BAUD_RATE Nmserial1 SUCCESS IOCTL_SERIAL_GET_LINE_CONTROL Nmserial1 SUCCESS IOCTL_SERIAL_GET_CHARS Nmserial1 SUCCESS IOCTL_SERIAL_GET_HANDFLOW Nmserial1 SUCCESS IOCTL_SERIAL_SET_BAUD_RATE Nmserial1 SUCCESS Rate: 9600 IOCTL_SERIAL_CLR_RTS Nmserial1 SUCCESS IOCTL_SERIAL_CLR_DTR Nmserial1 SUCCESS IOCTL_SERIAL_SET_LINE_CONTROL Nmserial1 SUCCESS StopBits: ERROR Parity: NONE WordLength: 8 IOCTL_SERIAL_SET_CHAR Nmserial1 SUCCESS EOF:1a ERR:0 BRK:0 EVT:1a XON:11 XOFF:13 IOCTL_SERIAL_SET_HANDFLOW Nmserial1 SUCCESS Shake:0 Replace:0 XonLimit:1024 XoffLimit:1024 IOCTL_SERIAL_GET_BAUD_RATE Nmserial1 SUCCESS IOCTL_SERIAL_GET_LINE_CONTROL Nmserial1 SUCCESS IOCTL_SERIAL_GET_CHARS Nmserial1 SUCCESS IOCTL_SERIAL_GET_HANDFLOW Nmserial1 SUCCESS IOCTL_SERIAL_SET_BAUD_RATE Nmserial1 SUCCESS Rate: 9600 IOCTL_SERIAL_CLR_RTS Nmserial1 SUCCESS IOCTL_SERIAL_CLR_DTR Nmserial1 SUCCESS IOCTL_SERIAL_SET_LINE_CONTROL Nmserial1 SUCCESS StopBits: ERROR Parity: NONE WordLength: 8 IOCTL_SERIAL_SET_CHAR Nmserial1 SUCCESS EOF:1a ERR:0 BRK:0 EVT:1a XON:11 XOFF:13 IOCTL_SERIAL_SET_HANDFLOW Nmserial1 SUCCESS Shake:0 Replace:0 XonLimit:1024 XoffLimit:1024 IOCTL_SERIAL_CLR_DTR Nmserial1 SUCCESS IOCTL_SERIAL_SET_TIMEOUTS Nmserial1 SUCCESS RI:-1 RM:-1 RC:-2 WM:0 WC:0 IOCTL_SERIAL_SET_WAIT_MASK Nmserial1 SUCCESS Mask: RXCHAR RXFLAG CTS DSR RLSD BRK ERR RING IOCTL_SERIAL_SET_QUEUE_SIZE Nmserial1 SUCCESS InSize: 4096 OutSize: 2048 IOCTL_SERIAL_WAIT_ON_MASK Nmserial1 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2015, 17:52 |
|
Сорректное хакрытие ComPort
|
|||
---|---|---|---|
#18+
Up темке. Если есть у кого то идеи по поводу перевода на библиотеки NET, буду рад помощи. Пример того что промониторил при работающем софте и то что выдает после использования NET библиотеки описал в предыдущем посте. И еще наверное лучше описать принцип работы железяки. По нажатию на кнопку на железке отправляются на ComPort 183 байта, после передачи в ответ необходимо передать последний полученный байт, сделать паузу небольшую, и еще передать набор байт для отображения информации на экране железяки. После чего опять переходить в режим ожидания 183 байтов. Вроде бы ничего сложного, но с использованием Net библиотеки не захотела работать, может быть что то не так делал. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2015, 08:54 |
|
Сорректное хакрытие ComPort
|
|||
---|---|---|---|
#18+
Вячеслав ДUp темке. Если есть у кого то идеи по поводу перевода на библиотеки NET, буду рад помощи. Пример того что промониторил при работающем софте и то что выдает после использования NET библиотеки описал в предыдущем посте. И еще наверное лучше описать принцип работы железяки. По нажатию на кнопку на железке отправляются на ComPort 183 байта, после передачи в ответ необходимо передать последний полученный байт, сделать паузу небольшую, и еще передать набор байт для отображения информации на экране железяки. После чего опять переходить в режим ожидания 183 байтов. Вроде бы ничего сложного, но с использованием Net библиотеки не захотела работать, может быть что то не так делал. я много раз организовывал связь комп-микроконтроллер при помощи стандартного SerialPort - проблем не возникало. для примера небольшой проектик. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2015, 18:48 |
|
Сорректное хакрытие ComPort
|
|||
---|---|---|---|
#18+
jenya7, Ага спасибо, уже завтра гляну его и о результатах отпишусь. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2015, 23:01 |
|
|
start [/forum/topic.php?fid=20&fpage=91&tid=1401786]: |
0ms |
get settings: |
14ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
29ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
others: | 10ms |
total: | 129ms |
0 / 0 |