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

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

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

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

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

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

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

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

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


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