8 битные ASCII коды
От: Loerosim  
Дата: 08.12.10 10:50
Оценка:
Читаю из COM-порта байтовую посылку с помощью: string s = comPort.ReadExisting();
В принятой строке меня интересуют не символы, а их ascii коды. Но вот проблема, все хорошо, только если ascii коды символов 7 битные. Если же символ 8 битный, то ему назначается значение 63. Подскажите, как быть. Пробовал и не помогло:
            string s = comPort.ReadExisting();
            Encoding src = Encoding.ASCII;
            Encoding dst = Encoding.GetEncoding("CP866");
            byte[] srcBuffer = src.GetBytes(s);
            byte[] inBuffer = Encoding.Convert(src, dst, srcBuffer);


PS если читаю именно байты с помощью функции comPort.Read(), то с перекодировкой проблем нет, но ситуация такая, что порт надо читать именно с помощью comPort.ReadExisting()...
Re: 8 битные ASCII коды
От: belnetmon Беларусь  
Дата: 08.12.10 11:45
Оценка:
L>PS если читаю именно байты с помощью функции comPort.Read(), то с перекодировкой проблем нет, но ситуация такая, что порт надо читать именно с помощью comPort.ReadExisting()...

if (mSerialPort.BytesToRead>....)
mSerialPort.Read(....);
Re[2]: 8 битные ASCII коды
От: Loerosim  
Дата: 08.12.10 11:49
Оценка:
Здравствуйте, belnetmon, Вы писали:


L>>PS если читаю именно байты с помощью функции comPort.Read(), то с перекодировкой проблем нет, но ситуация такая, что порт надо читать именно с помощью comPort.ReadExisting()...


B>if (mSerialPort.BytesToRead>....)

B> mSerialPort.Read(....);

Я же вроде написал, что читать порт мне надо именно с помощью функции comPort.ReadExisting
С помощью Read() как Вы правильно процитировали проблем нет.
Re: 8 битные ASCII коды
От: k.o. Россия  
Дата: 08.12.10 11:52
Оценка: 3 (1) +1
Здравствуйте, Loerosim, Вы писали:

L>Читаю из COM-порта байтовую посылку с помощью: string s = comPort.ReadExisting();

L>В принятой строке меня интересуют не символы, а их ascii коды. Но вот проблема, все хорошо, только если ascii коды символов 7 битные. Если же символ 8 битный, то ему назначается значение 63. Подскажите, как быть. Пробовал и не помогло:
L>
              comPort.Encoding = Encoding.GetEncoding("CP866")
L>            string s = comPort.ReadExisting();
L>


L>PS если читаю именно байты с помощью функции comPort.Read(), то с перекодировкой проблем нет, но ситуация такая, что порт надо читать именно с помощью comPort.ReadExisting()...


Попробуй установить encoding для SerialPort, правда, не понятно, зачем вобще читать строку и потом преобразовывать её обратно в байты.
Re[2]: 8 битные ASCII коды
От: Loerosim  
Дата: 08.12.10 12:07
Оценка:
Здравствуйте, k.o., Вы писали:

KO>Здравствуйте, Loerosim, Вы писали:


L>>Читаю из COM-порта байтовую посылку с помощью: string s = comPort.ReadExisting();

L>>В принятой строке меня интересуют не символы, а их ascii коды. Но вот проблема, все хорошо, только если ascii коды символов 7 битные. Если же символ 8 битный, то ему назначается значение 63. Подскажите, как быть. Пробовал и не помогло:
L>>
KO>              comPort.Encoding = Encoding.GetEncoding("CP866")
L>>            string s = comPort.ReadExisting();
L>>


L>>PS если читаю именно байты с помощью функции comPort.Read(), то с перекодировкой проблем нет, но ситуация такая, что порт надо читать именно с помощью comPort.ReadExisting()...


KO>Попробуй установить encoding для SerialPort, правда, не понятно, зачем вобще читать строку и потом преобразовывать её обратно в байты.


Спасибо большое: comPort.Encoding = Encoding.GetEncoding("CP866") то что нужно, все работает.
Читать строку нужно потому, что в других случаях на некоторых com портах есть вероятность возникновения исключения из-за того, что во внутренний реализации класса SerialPort допущена ошибка и установлен бит fAbortOnError структуры DCB — если интересно могу найти статью, описывающую этот момент.
Re[3]: 8 битные ASCII коды
От: k.o. Россия  
Дата: 08.12.10 16:17
Оценка:
Здравствуйте, Loerosim, Вы писали:

L>Здравствуйте, k.o., Вы писали:


KO>>Здравствуйте, Loerosim, Вы писали:


KO>>Попробуй установить encoding для SerialPort, правда, не понятно, зачем вобще читать строку и потом преобразовывать её обратно в байты.


L>Спасибо большое: comPort.Encoding = Encoding.GetEncoding("CP866") то что нужно, все работает.

L>Читать строку нужно потому, что в других случаях на некоторых com портах есть вероятность возникновения исключения из-за того, что во внутренний реализации класса SerialPort допущена ошибка и установлен бит fAbortOnError структуры DCB — если интересно могу найти статью, описывающую этот момент.

Это не оно? Так там, вроде, workaround есть, да и ReadExisting, должен точно также падать, он же, всё-равно, внутри вызывает Read.
Re[4]: 8 битные ASCII коды
От: Loerosim  
Дата: 09.12.10 07:35
Оценка:
Здравствуйте, k.o., Вы писали:

KO>Здравствуйте, Loerosim, Вы писали:


L>>Здравствуйте, k.o., Вы писали:


KO>>>Здравствуйте, Loerosim, Вы писали:


KO>>>Попробуй установить encoding для SerialPort, правда, не понятно, зачем вобще читать строку и потом преобразовывать её обратно в байты.


L>>Спасибо большое: comPort.Encoding = Encoding.GetEncoding("CP866") то что нужно, все работает.

L>>Читать строку нужно потому, что в других случаях на некоторых com портах есть вероятность возникновения исключения из-за того, что во внутренний реализации класса SerialPort допущена ошибка и установлен бит fAbortOnError структуры DCB — если интересно могу найти статью, описывающую этот момент.

KO>Это не оно? Так там, вроде, workaround есть, да и ReadExisting, должен точно также падать, он же, всё-равно, внутри вызывает Read.


Оно, но workaround не охота было городить. И как это не парадоксально ReadExisting с этой ошибкой не замечен и не только мной.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.