Как я могу отправлять произвольные байты через последовательный порт Windows с помощью приложения Java?

Я пытаюсь отправить произвольные двоичные данные через последовательный COM-порт, используя Java в Windows. Кажется, есть какое-то сопоставление, которое оно (Java или Windows) выполняет с данными перед их отправкой. Я не очень хорошо знаком с COM-интерфейсом Windows, поэтому я надеюсь, что есть параметр ioctl-esq для отключения этого поведения и что разработчики Windows «просто знают», как с этим справиться.

Когда я отправляю массив двоичных байтов со значениями 0-255, я получаю на другом конце следующее:

                                                        0x00
0x01    0x02    0x03    0x04    0x05    0x06    0x07    0x08
0x09    0x0a    0x0b    0x0c    0x0d    0x0e    0x0f    0x10
0x11    0x12    0x13    0x14    0x15    0x16    0x17    0x18
0x19    0x1a    0x1b    0x1c    0x1d    0x1e    0x1f    0x20
0x21    0x22    0x23    0x24    0x25    0x26    0x27    0x28
0x29    0x2a    0x2b    0x2c    0x2d    0x2e    0x2f    0x30
0x31    0x32    0x33    0x34    0x35    0x36    0x37    0x38
0x39    0x3a    0x3b    0x3c    0x3d    0x3e    0x3f    0x40
0x41    0x42    0x43    0x44    0x45    0x46    0x47    0x48
0x49    0x4a    0x4b    0x4c    0x4d    0x4e    0x4f    0x50
0x51    0x52    0x53    0x54    0x55    0x56    0x57    0x58
0x59    0x5a    0x5b    0x5c    0x5d    0x5e    0x5f    0x60
0x61    0x62    0x63    0x64    0x65    0x66    0x67    0x68
0x69    0x6a    0x6b    0x6c    0x6d    0x6e    0x6f    0x70
0x71    0x72    0x73    0x74    0x75    0x76    0x77    0x78
0x79    0x7a    0x7b    0x7c    0x7d    0x7e    0x7f    0x3f
0x3f    0x3f    0x3f    0x3f    0x3f    0x3f    0x3f    0x3f
0x3f    0x3f    0x3f    0x3f    0x3f    0x3f    0x3f    0x3f
0x3f    0x3f    0x3f    0x3f    0x3f    0x3f    0x3f    0x3f
0x3f    0x3f    0x3f    0x3f    0x3f    0x3f    0x3f    0xa0
0xa1    0xa2    0xa3    0xa4    0xa5    0xa6    0xa7    0xa8
0xa9    0xaa    0xab    0xac    0xad    0xae    0xaf    0xb0
0xb1    0xb2    0xb3    0xb4    0xb5    0xb6    0xb7    0xb8
0xb9    0xba    0xbb    0xbc    0xbd    0xbe    0xbf    0xc0
0xc1    0xc2    0xc3    0xc4    0xc5    0xc6    0xc7    0xc8
0xc9    0xca    0xcb    0xcc    0xcd    0xce    0xcf    0xd0
0xd1    0xd2    0xd3    0xd4    0xd5    0xd6    0xd7    0xd8
0xd9    0xda    0xdb    0xdc    0xdd    0xde    0xdf    0xe0
0xe1    0xe2    0xe3    0xe4    0xe5    0xe6    0xe7    0xe8
0xe9    0xea    0xeb    0xec    0xed    0xee    0xef    0xf0
0xf1    0xf2    0xf3    0xf4    0xf5    0xf6    0xf7    0xf8
0xf9    0xfa    0xfb    0xfc    0xfd    0xfe    0xff    

Обратите внимание, что значения переключаются на 0x3f, когда байты переходят от 0x80-0x9f.

Извините за отсутствие подробностей, но я имею дело с закрытой (коммерческой) библиотекой Java, и у меня возникла странная проблема, которая может быть связана с ОС или Java. Кроме того, представитель службы поддержки библиотеки не считает, что библиотека виновата.

Примечание. Я знаю только о подписанных байтах Java, поэтому я осторожен при работе с ними, хотя рассматриваемая библиотека может их испортить.


person CodePoet    schedule 04.10.2011    source источник
comment
Пожалуйста, покажите какой-нибудь код для того, как вы пишете и как вы читаете данные. Я сильно подозреваю, что вы где-то используете текстовую кодировку (или что-то еще), но трудно сказать, не видя никакого кода.   -  person Jon Skeet    schedule 04.10.2011
comment
возможно, это потому, что данные не упакованы при отправке. выравнивание может вызвать такие ошибки.   -  person stdcall    schedule 04.10.2011
comment
Mellowcandle вызвал у меня паранойю по поводу моего байта [], и оказалось, что там была проблема. Я использовал String в качестве посредника и вызывал .getBytes(). Это испортило кодировку. Пока не знаю, почему...   -  person CodePoet    schedule 04.10.2011
comment
Спасибо и тебе, Джон. Я подозреваю, что это то, что делает String.toBytes(). Мне нужно понять, какую кодировку он использует, или перейти к доступу только к байту [].   -  person CodePoet    schedule 04.10.2011


Ответы (1)


Проблема заключалась в том, что String кодировала данные, которые я добавлял. Я наивно предполагал, что могу добавить произвольные данные в строку, а затем вызвать для нее getBytes(), чтобы получить массив byte[]. Оказывается, String кодировала добавленные данные, а исходящие байты не соответствовали концу байтов.

Спасибо за полезные комментарии.

person CodePoet    schedule 05.10.2011