Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сорректное хакрытие ComPort / 16 сообщений из 16, страница 1 из 1
13.03.2015, 14:27
    #38903926
Вячеслав Д
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сорректное хакрытие ComPort
Добрый день.
Не могу побороть одну проблему.
Имеется некая железка которая работает через ComPort корректно получается работать c ComPort только через winApi
То есть CreateFile, ReadFile, WriteFile
Все работает нормально, пока не дошло дело до закрытия порта То есть вызвать CloseHandle
и тут наступает тормоз.
Теперь по порядку как работает логика.
Открываю порт и сразу же запускаю на чтение (ожидаю данные), как только данные пришли, обработал их в ответ шлю на железку необходимые данные, и опять останавливаюсь на чтение. Нужно организовать закрытие порта, а то получается что когда запускаю Closehandle программа ждет хотя бы один байт с порта.

Спасибо.
...
Рейтинг: 0 / 0
13.03.2015, 14:58
    #38903979
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сорректное хакрытие ComPort
PurgeComm звал?
...
Рейтинг: 0 / 0
13.03.2015, 15:10
    #38904009
Вячеслав Д
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сорректное хакрытие ComPort
Вызывал не помогает
Вот метод на закрытие
public void Close()
{
Purge(15);
if (IsOpen())
{
bool t =CloseHandle(hPortHandle);
}
}
...
Рейтинг: 0 / 0
13.03.2015, 15:11
    #38904012
Вячеслав Д
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сорректное хакрытие ComPort
Метод purge выглядит так
public void Purge(int Flag)
{
PurgeComm(hPortHandle, Flag);
}
...
Рейтинг: 0 / 0
13.03.2015, 15:16
    #38904027
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сорректное хакрытие ComPort
Вячеслав Д,

таймауты выставлял?
...
Рейтинг: 0 / 0
13.03.2015, 15:23
    #38904036
Вячеслав Д
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сорректное хакрытие ComPort
Да, и таймауты выставлял тоже не помогло
вот код для открытия
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);

}
...
Рейтинг: 0 / 0
13.03.2015, 15:29
    #38904051
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сорректное хакрытие ComPort
Вячеслав Д,

Учимся использовать тэги оформления кода - FAQ
...
Рейтинг: 0 / 0
13.03.2015, 15:29
    #38904053
Вячеслав Д
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сорректное хакрытие ComPort
Так ребята.
Большой спасибо, похоже да Вы были правы, дело в таймаутах было, сейчас корректно обработаю, должно быть нормально.
О результатах чуть позже отпишусь.
...
Рейтинг: 0 / 0
13.03.2015, 15:31
    #38904054
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сорректное хакрытие ComPort
Вячеслав ДИмеется некая железка которая работает через ComPort корректно получается работать c ComPort только через winApi
.

А почему с SerialPort не работает-то?
...
Рейтинг: 0 / 0
13.03.2015, 15:39
    #38904073
Вячеслав Д
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сорректное хакрытие ComPort
Pallaris,

Да, как бы сказать есть некая железяка и рабочий софт, и все больше ничего нету, надо переписать на шарп и уже данные хранить не в парадоксовской базе а на сервере mssql. но это уже реализовано, а вот запнулся при получении данных.
Попробовал использовать SerialPort, после того как открываю порт через фреймворк, потом закрываю его, перестает работать старое ПО, помогает только перезагрузка компа, никакой технической информации нету, что надо получить, что надо передать.
Помогла программулинка ComPortMonitor, которая вешается на уже открытый порт и слушает его, это была зацепка, так вот когда открываешь через winApi и через SerialPort совсем большая разница в этом мониторе по поводу открытия порта.
Вот почему начал использовать winapi
...
Рейтинг: 0 / 0
13.03.2015, 16:16
    #38904146
fortibransa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сорректное хакрытие ComPort
Вячеслав ДPallaris,

Да, как бы сказать есть некая железяка и рабочий софт, и все больше ничего нету, надо переписать на шарп и уже данные хранить не в парадоксовской базе а на сервере mssql. но это уже реализовано, а вот запнулся при получении данных.
Попробовал использовать SerialPort, после того как открываю порт через фреймворк, потом закрываю его, перестает работать старое ПО, помогает только перезагрузка компа, никакой технической информации нету, что надо получить, что надо передать.
Помогла программулинка ComPortMonitor, которая вешается на уже открытый порт и слушает его, это была зацепка, так вот когда открываешь через winApi и через SerialPort совсем большая разница в этом мониторе по поводу открытия порта.
Вот почему начал использовать winapiКак интересно и какая разница? Выслал бы чо там и там монитор, наманиторил.
...
Рейтинг: 0 / 0
13.03.2015, 17:52
    #38904343
Вячеслав Д
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сорректное хакрытие ComPort
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.
port = new System.IO.Ports.SerialPort("COM4", 9600, System.IO.Ports.Parity.None, 8, System.IO.Ports.StopBits.Two);
port.Open();


такое происходит
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
...
Рейтинг: 0 / 0
16.03.2015, 08:54
    #38905495
Вячеслав Д
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сорректное хакрытие ComPort
Up темке.
Если есть у кого то идеи по поводу перевода на библиотеки NET, буду рад помощи. Пример того что промониторил при работающем софте и то что выдает после использования NET библиотеки описал в предыдущем посте.
И еще наверное лучше описать принцип работы железяки. По нажатию на кнопку на железке отправляются на ComPort 183 байта, после передачи в ответ необходимо передать последний полученный байт, сделать паузу небольшую, и еще передать набор байт для отображения информации на экране железяки. После чего опять переходить в режим ожидания 183 байтов.
Вроде бы ничего сложного, но с использованием Net библиотеки не захотела работать, может быть что то не так делал.
...
Рейтинг: 0 / 0
18.03.2015, 18:48
    #38908946
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сорректное хакрытие ComPort
Вячеслав ДUp темке.
Если есть у кого то идеи по поводу перевода на библиотеки NET, буду рад помощи. Пример того что промониторил при работающем софте и то что выдает после использования NET библиотеки описал в предыдущем посте.
И еще наверное лучше описать принцип работы железяки. По нажатию на кнопку на железке отправляются на ComPort 183 байта, после передачи в ответ необходимо передать последний полученный байт, сделать паузу небольшую, и еще передать набор байт для отображения информации на экране железяки. После чего опять переходить в режим ожидания 183 байтов.
Вроде бы ничего сложного, но с использованием Net библиотеки не захотела работать, может быть что то не так делал.

я много раз организовывал связь комп-микроконтроллер при помощи стандартного SerialPort - проблем не возникало.
для примера небольшой проектик.
...
Рейтинг: 0 / 0
18.03.2015, 23:01
    #38909148
Вячеслав Д
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сорректное хакрытие ComPort
jenya7,

Ага спасибо, уже завтра гляну его и о результатах отпишусь.
...
Рейтинг: 0 / 0
19.03.2015, 10:47
    #38909476
Вячеслав Д
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сорректное хакрытие ComPort
jenya7,
Спасибо тебе огрооомное, действительно заработало на ура, и все корректно принимает, отправляет.
Вообще не могу какого не работало у меня сразу. Зато столько нового узнал по работе с компортом.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сорректное хакрытие ComPort / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]