Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
количество байт в порту c++ linux
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Пытаюсь реализовать свой протокол передачи данных по COM порту и столкнулся с вопросом о том, а как же узнать сколько байт в порту уже принято перед чтением этих данных. Объясняю для чего: в получаемых пакетах данных (массив байт) в начале каждого пакета идет так называемая шапка длиной в 8 байт, все остальное непосредственно данные пакета. а так как в шапке содержится информация о том, какова длина последующих данных, то возникает необходимость сначала получить необходимые 8 байт шапки пакета. Ранее я всегда программировал на delphi и на С++ под linux начал буквально вчера. можно сказать это всего лишь третий по счету написанный мною класс. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 14:58 |
|
||
|
количество байт в порту c++ linux
|
|||
|---|---|---|---|
|
#18+
fs99а так как в шапке содержится информация о том, какова длина последующих данных, то возникает необходимость сначала получить необходимые 8 байт шапки пакета. Ну так что тебе мешает в цикле восемь раз получить по одному байту, сложить их в буфер и радоваться жизни? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 15:09 |
|
||
|
количество байт в порту c++ linux
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovfs99а так как в шапке содержится информация о том, какова длина последующих данных, то возникает необходимость сначала получить необходимые 8 байт шапки пакета. Ну так что тебе мешает в цикле восемь раз получить по одному байту, сложить их в буфер и радоваться жизни? ну ведь там может и не быть 8 байт (а быть например 6 или 5), да и как-то не красиво это делать в цикле. тем более наличие >= 8 байт в порту указывает на то, что там вообще есть данные и эти данные содержат заголовок ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 15:26 |
|
||
|
количество байт в порту c++ linux
|
|||
|---|---|---|---|
|
#18+
fs99ну ведь там может и не быть 8 байт (а быть например 6 или 5) Ну так получишь эти 5 или 6 сейчас, а остальные 3 или 2 - позже. СОМ-порт вообще оперирует чисто байтами, нигде не гарантируется, что послав 8 байт одной пачкой, на другом конце получишь эти 8 байт тоже одной пачкой. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 15:33 |
|
||
|
количество байт в порту c++ linux
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovfs99ну ведь там может и не быть 8 байт (а быть например 6 или 5) Ну так получишь эти 5 или 6 сейчас, а остальные 3 или 2 - позже. СОМ-порт вообще оперирует чисто байтами, нигде не гарантируется, что послав 8 байт одной пачкой, на другом конце получишь эти 8 байт тоже одной пачкой. В принципе как вариант, конечно. Можно попробовать, но все же хотелось бы знать о такой команде/функции о которой я спрашивал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 15:36 |
|
||
|
количество байт в порту c++ linux
|
|||
|---|---|---|---|
|
#18+
можно попробовать собирать получаемые байты в массив байт, далее при наличии в массиве не менее 8 байт и isHDR == true оперировать с ними, а остаток массива уже передавать коду исполняемому в случае isHDR == false и работать в нем пока не будут получены все данные длиной указанной в шапке и после снова переходить в режим isHDR == true ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 15:40 |
|
||
|
количество байт в порту c++ linux
|
|||
|---|---|---|---|
|
#18+
fs99Dimitry Sibiryakovпропущено... Ну так что тебе мешает в цикле восемь раз получить по одному байту, сложить их в буфер и радоваться жизни? ну ведь там может и не быть 8 байт (а быть например 6 или 5), да и как-то не красиво это делать в цикле. тем более наличие >= 8 байт в порту указывает на то, что там вообще есть данные и эти данные содержат заголовок У тебя же стоят параметры порта: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 15:42 |
|
||
|
количество байт в порту c++ linux
|
|||
|---|---|---|---|
|
#18+
fs99можно попробовать собирать получаемые байты в массив байт, далее при наличии в массиве не менее 8 байт и isHDR == true оперировать с ними, а остаток массива уже передавать коду исполняемому в случае isHDR == false и работать в нем пока не будут получены все данные длиной указанной в шапке и после снова переходить в режим isHDR == true правда тогда может возникнуть ситуация, когда несколько байт утеряно и можем просто завиcнуть в этом цикле b не вернуться вовремя в режим isHRD == true или еще хуже принять недостающие байты из последовательности нового пакета и тогда нарушена будет целостность обоих. ........ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 15:45 |
|
||
|
количество байт в порту c++ linux
|
|||
|---|---|---|---|
|
#18+
COM:fs99пропущено... ну ведь там может и не быть 8 байт (а быть например 6 или 5), да и как-то не красиво это делать в цикле. тем более наличие >= 8 байт в порту указывает на то, что там вообще есть данные и эти данные содержат заголовок У тебя же стоят параметры порта: Код: plaintext 1. 2. 3. Кстати. по поводу параметров: options.c_cc[VMIN] = 1; - это понятно для меня как условие, что можно считать что есть данные тогда и только тогда, когда принято не менее одного байта остальные два параметра options.c_cc[VTIME] = 10; и options.c_lflag = ICANON; пока для меня не понятны. можете проконсультировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 15:48 |
|
||
|
количество байт в порту c++ linux
|
|||
|---|---|---|---|
|
#18+
fs99COM:пропущено... У тебя же стоят параметры порта: Код: plaintext 1. 2. 3. Кстати. по поводу параметров: options.c_cc[VMIN] = 1; - это понятно для меня как условие, что можно считать что есть данные тогда и только тогда, когда принято не менее одного байта остальные два параметра options.c_cc[VTIME] = 10; и options.c_lflag = ICANON; пока для меня не понятны. можете проконсультировать. Могу, но это подробно расписано в мане termios ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 15:56 |
|
||
|
количество байт в порту c++ linux
|
|||
|---|---|---|---|
|
#18+
fs99В принципе как вариант, конечно. Можно попробовать, но все же хотелось бы знать о такой команде/функции о которой я спрашивал. А о какой ты спрашивал ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 15:57 |
|
||
|
количество байт в порту c++ linux
|
|||
|---|---|---|---|
|
#18+
fs99fs99можно попробовать собирать получаемые байты в массив байт, далее при наличии в массиве не менее 8 байт и isHDR == true оперировать с ними, а остаток массива уже передавать коду исполняемому в случае isHDR == false и работать в нем пока не будут получены все данные длиной указанной в шапке и после снова переходить в режим isHDR == true правда тогда может возникнуть ситуация, когда несколько байт утеряно и можем просто завиcнуть в этом цикле b не вернуться вовремя в режим isHRD == true или еще хуже принять недостающие байты из последовательности нового пакета и тогда нарушена будет целостность обоих. ........ Я вообще ничего не понял. ЭТо -- последовательный порт. Он читает байты последовательно, как ни пародоксально. Сначаала один, потом другой, потом третий. На пакеты этот поток делишь уже ты сам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 15:59 |
|
||
|
количество байт в порту c++ linux
|
|||
|---|---|---|---|
|
#18+
fs99, автор RcvdDataLen = <КАК ЗДЕСЬ ПОЛУЧИТЬ КОЛИЧЕСТВО БАЙТ В ПОРТУ???>; Да никак не получить. Ты просто должен читать оттуда байты и обрабатывать. Вся работа с терминалами и с портами устоена так, что обработка может быть сделана последовательно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 16:04 |
|
||
|
количество байт в порту c++ linux
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. А где собственно чтение ? Чтение из порта без чтения -- оригинально... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 16:05 |
|
||
|
количество байт в порту c++ linux
|
|||
|---|---|---|---|
|
#18+
MasterZivЯ вообще ничего не понял. ЭТо -- последовательный порт. Он читает байты последовательно, как ни пародоксально. Сначаала один, потом другой, потом третий. На пакеты этот поток делишь уже ты сам. То что байты последовательно это да, с любым портом вроде так. Но насколько я помню со времен своих школьных опытов с лампочками на портах, последовательным он называется потому, что данные передаются побитово , в отличии от LPT порта на контакты которого можно выставить 1 байт сразу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 16:13 |
|
||
|
количество байт в порту c++ linux
|
|||
|---|---|---|---|
|
#18+
fs99fs99можно попробовать собирать получаемые байты в массив байт, далее при наличии в массиве не менее 8 байт и isHDR == true оперировать с ними, а остаток массива уже передавать коду исполняемому в случае isHDR == false и работать в нем пока не будут получены все данные длиной указанной в шапке и после снова переходить в режим isHDR == true правда тогда может возникнуть ситуация, когда несколько байт утеряно и можем просто завиcнуть в этом цикле b не вернуться вовремя в режим isHRD == true или еще хуже принять недостающие байты из последовательности нового пакета и тогда нарушена будет целостность обоих. Для потоковых (не REST) протоколов передачи, используют маркировку конца и начала пакета специальной последовательностью байт, которая в принципе не может встречаться в данных, или если встречается то маскируется. Например, вы можете закодировать данные в base64 и передавать их в кодировке utf8, а в качестве маркера начала и конца пакета использовать 0xFFFE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 16:25 |
|
||
|
количество байт в порту c++ linux
|
|||
|---|---|---|---|
|
#18+
sherzod_MasterZivЯ вообще ничего не понял. ЭТо -- последовательный порт. Он читает байты последовательно, как ни пародоксально. Сначаала один, потом другой, потом третий. На пакеты этот поток делишь уже ты сам. То что байты последовательно это да, с любым портом вроде так. Но насколько я помню со времен своих школьных опытов с лампочками на портах, последовательным он называется потому, что данные передаются побитово , в отличии от LPT порта на контакты которого можно выставить 1 байт сразу. Именно так. Но уж никак это не блоковое устройство. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 16:40 |
|
||
|
количество байт в порту c++ linux
|
|||
|---|---|---|---|
|
#18+
sherzod_fs99пропущено... правда тогда может возникнуть ситуация, когда несколько байт утеряно и можем просто завиcнуть в этом цикле b не вернуться вовремя в режим isHRD == true или еще хуже принять недостающие байты из последовательности нового пакета и тогда нарушена будет целостность обоих. Для потоковых (не REST) протоколов передачи, используют маркировку конца и начала пакета специальной последовательностью байт, которая в принципе не может встречаться в данных, или если встречается то маскируется. Например, вы можете закодировать данные в base64 и передавать их в кодировке utf8, а в качестве маркера начала и конца пакета использовать 0xFFFE. В контексте вопроса ТС это называется санонический режим. И разделитель "блоков" - перевод строки. И побайтно читать неполучится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 16:54 |
|
||
|
количество байт в порту c++ linux
|
|||
|---|---|---|---|
|
#18+
fs99Dimitry Sibiryakovпропущено... Ну так получишь эти 5 или 6 сейчас, а остальные 3 или 2 - позже. СОМ-порт вообще оперирует чисто байтами, нигде не гарантируется, что послав 8 байт одной пачкой, на другом конце получишь эти 8 байт тоже одной пачкой. В принципе как вариант, конечно. Можно попробовать, но все же хотелось бы знать о такой команде/функции о которой я спрашивал. Для сокетов есть параметр getsockopt (не помню давно этим пользовался, уже лет 5 ничего не пишу) при котором он возвращает количество байт в буфере достопные на чтение блокирующей операцией без ожидания прихода из сети чего либо еще. возможно для компортов есть что то подобное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 17:24 |
|
||
|
количество байт в порту c++ linux
|
|||
|---|---|---|---|
|
#18+
fs99Пытаюсь реализовать свой протокол передачи данных по COM порту PPP чем не угодил??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2013, 18:39 |
|
||
|
количество байт в порту c++ linux
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorovfs99Пытаюсь реализовать свой протокол передачи данных по COM порту PPP чем не угодил??? PPP немного не то . надо cu смотреть. Думаю в его исходниках ТС найдет все, что ему нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2013, 10:48 |
|
||
|
количество байт в порту c++ linux
|
|||
|---|---|---|---|
|
#18+
хм.. тогда следующая ситуация: Пришло какое-то количество байт (неизвестное количество), в заголовке моем уже есть, ну скажем 3 из 8 байт. Значит мне осталось прочитать 5 для заголовка. прийти в порт может конечно и менее пяти, но допустим пришло 9. Следовательно мне нужно прочитать только 5, а оставшиеся 4 байта оставить в порту для другой функции. вот как я это делал на Delphi: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. Очень удобно заранее знать количество байт в порту и далее с этими знаниями уже оперировать байтами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2013, 08:43 |
|
||
|
количество байт в порту c++ linux
|
|||
|---|---|---|---|
|
#18+
fs99хм.. Очень удобно заранее знать количество байт в порту и далее с этими знаниями уже оперировать байтами. Вы должны понять что именно эта фича которая вам требуется, должна быть реализована вами. С портом вы должны работать как с потоком байт а не как с блочным устройством на котором доступен какой-то блок. То есть у вас должен быть транспортный слой, а все другие функции должны обращаться к нему. Прочитайте все ответы которые вам дали более вдумчиво и внимательно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2013, 08:59 |
|
||
|
количество байт в порту c++ linux
|
|||
|---|---|---|---|
|
#18+
ВОПРОС РЕШЕН!!! Получение числа доступных байтов Вызов FIONREAD ioctl получает число байтов в приемном буфере последовательного порта. Также как и в случае с TIOCMGET вам необходимо передать указатель на integer переменную для сохранения результата: Листинг 7 - Получение числа байтов в приемном буфере. #include <unistd.h> #include <termios.h> int fd; int bytes; ioctl(fd, FIONREAD, &bytes); Это может быть полезно при опросе наличия данных от последовательного порта, когда ваша программа определяет количество байтов в приемном буфере до того как читать данные из последовательного порта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 09:39 |
|
||
|
количество байт в порту c++ linux
|
|||
|---|---|---|---|
|
#18+
fs99ВОПРОС РЕШЕН!!! Получение числа доступных байтов Вызов FIONREAD ioctl получает число байтов в приемном буфере последовательного порта. Также как и в случае с TIOCMGET вам необходимо передать указатель на integer переменную для сохранения результата: Листинг 7 - Получение числа байтов в приемном буфере. #include <unistd.h> #include <termios.h> int fd; int bytes; ioctl(fd, FIONREAD, &bytes); Это может быть полезно при опросе наличия данных от последовательного порта, когда ваша программа определяет количество байтов в приемном буфере до того как читать данные из последовательного порта. В дополнение: http://www.opennet.ru/docs/RUS/serial_guide/index.html#5_1_3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2013, 09:41 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38345487&tid=2020062]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
89ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 16ms |
| total: | 202ms |

| 0 / 0 |
