|
Задержки для COM порта под Win XP, Программирование на С++ Builder |
|
|
|
Oct 7 2005, 03:23
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 29-09-05
Пользователь №: 9 060

|
Доброго всем времени суток. При иннициализации порта: hCom = CreateFile("COM3", GENERIC_READ | GENERIC_WRITE,0, NULL,OPEN_EXISTING, 0,NULL ); Устанавливаются следующие задержки на чтение: COMMTIMEOUTS times; ... times.ReadIntervalTimeout = MAXDWORD; times.ReadTotalTimeoutMultiplier = MAXDWORD; times.ReadTotalTimeoutConstant = 5; ... Далее в программе происходит запись в порт 8 байт, и прием одного байта ответа: WriteFile(hCom,Buffer,8,&b,NULL); ReadFile (hCom,&i,1,&b,NULL); И все это происходит в цикле. Собственно проблема: на осциллографе видно, что передача 8 байт и ответный байт на скорости 9600 укладываются примерно в 10 мс, а следующая посылка данных происходит примерно только через 30 мс. Откуда берется это время - не понятно. При попытке читат 2 байта из порта (второго байта нет, т.е. должен происходить таймаут) картина полностью идентична описаной. При коде: WriteFile(hCom,Buffer,8,&b,NULL); ReadFile (hCom,&i,1,&b,NULL); ReadFile (hCom,&i,1,&b,NULL); задержка возрастает примерно до 100 мс. :-(. При увеличении скорости порта до 19200 скорость передачи данных сократилась незначительно: задержка между посылками возросла на то же самое время, на какое сократилось время передачи данных. Да, забыл: СОМ3 - это порт для преобразователя USB-RS485. Т.е. с компутера данные реально отправляются на через USB порт на преобразователь, и далее по линии RS485. Данные снимались осциллографом на преобразователе со стороны RS485, но преобразователь тут точно не при чем, он был испытан на самодельном устройстве - USB передатчике, никаких левых задержек не наблюдалось. Кто знает в чем дело - помогите, плз. Кто не знает - может выдвигать версии, все будет внимательно рассмотрено, проверено.
|
|
|
|
|
 |
Ответов
|
Oct 7 2005, 07:58
|
Частый гость
 
Группа: Свой
Сообщений: 199
Регистрация: 17-12-04
Из: Миасс
Пользователь №: 1 519

|
Вот кусок из доки The COMMTIMEOUTS structure is used in the SetCommTimeouts and GetCommTimeouts functions to set and query the time-out parameters for a communications device. The parameters determine the behavior of ReadFile, WriteFile, ReadFileEx, and WriteFileEx operations on the device.
typedef struct _COMMTIMEOUTS { // ctmo DWORD ReadIntervalTimeout; DWORD ReadTotalTimeoutMultiplier; DWORD ReadTotalTimeoutConstant; DWORD WriteTotalTimeoutMultiplier; DWORD WriteTotalTimeoutConstant; } COMMTIMEOUTS,*LPCOMMTIMEOUTS;
Members
ReadIntervalTimeout
Specifies the maximum time, in milliseconds, allowed to elapse between the arrival of two characters on the communications line. During a ReadFile operation, the time period begins when the first character is received. If the interval between the arrival of any two characters exceeds this amount, the ReadFile operation is completed and any buffered data is returned. A value of zero indicates that interval time-outs are not used. A value of MAXDWORD, combined with zero values for both the ReadTotalTimeoutConstant and ReadTotalTimeoutMultiplier members, specifies that the read operation is to return immediately with the characters that have already been received, even if no characters have been received.
ReadTotalTimeoutMultiplier
Specifies the multiplier, in milliseconds, used to calculate the total time-out period for read operations. For each read operation, this value is multiplied by the requested number of bytes to be read.
ReadTotalTimeoutConstant
Specifies the constant, in milliseconds, used to calculate the total time-out period for read operations. For each read operation, this value is added to the product of the ReadTotalTimeoutMultiplier member and the requested number of bytes. A value of zero for both the ReadTotalTimeoutMultiplier and ReadTotalTimeoutConstant members indicates that total time-outs are not used for read operations.
WriteTotalTimeoutMultiplier
Specifies the multiplier, in milliseconds, used to calculate the total time-out period for write operations. For each write operation, this value is multiplied by the number of bytes to be written.
WriteTotalTimeoutConstant
Specifies the constant, in milliseconds, used to calculate the total time-out period for write operations. For each write operation, this value is added to the product of the WriteTotalTimeoutMultiplier member and the number of bytes to be written. A value of zero for both the WriteTotalTimeoutMultiplier and WriteTotalTimeoutConstant members indicates that total time-outs are not used for write operations.
Remarks
If an application sets ReadIntervalTimeout and ReadTotalTimeoutMultiplier to MAXDWORD and sets ReadTotalTimeoutConstant to a value greater than zero and less than MAXDWORD, one of the following occurs when the ReadFile function is called:
· If there are any characters in the input buffer, ReadFile returns immediately with the characters in the buffer. · If there are no characters in the input buffer, ReadFile waits until a character arrives and then returns immediately. · If no character arrives within the time specified by ReadTotalTimeoutConstant, ReadFile times out.
See Also
GetCommTimeouts, ReadFile, ReadFileEx, SetCommTimeouts, WriteFile, WriteFileEx
|
|
|
|
Сообщений в этой теме
AKK Задержки для COM порта под Win XP Oct 7 2005, 03:23 TsAN AKK, если хотите избежать таких вот лишних задерже... Oct 7 2005, 03:53 AKK Цитата(TsAN @ Oct 7 2005, 09:53)AKK, если хот... Oct 7 2005, 04:19  TsAN Цитата(AKK @ Oct 7 2005, 07:19)я не настолько... Oct 7 2005, 06:59 Tech У меня фунции работы с COM портом выделены в отдел... Oct 7 2005, 04:58 AKK Цитата(Tech @ Oct 7 2005, 10:58)Покажите, по ... Oct 7 2005, 07:18 Tech Ничего плохого в коде не вижу.
Попробуйте
dcb.fOut... Oct 7 2005, 08:11 AKK [Цитата(Tech @ Oct 7 2005, 14:11)И можно еще ... Oct 11 2005, 03:38 Tech Эта статья есть и здесь http://www.rs232.ru/doc002... Oct 11 2005, 04:04 SM На мой взгляд описанная проблема вытекает исключит... Oct 11 2005, 05:30 xelos как уже было сказано, выносите операции чтения/зап... Oct 20 2005, 20:56 starter48 Цитата(AKK @ Oct 7 2005, 10:23)...
Далее в пр... Oct 22 2005, 14:40 AKK Буфера FIFO отключены. Oct 24 2005, 02:24
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|