Gilcecler Carneiro Ответов: 3

Как написать последовательный порт


Приведенный ниже код возвращает ошибку:
Система.Ошибка FormatException: входная строка была не в правильном формате.

Что я уже пробовал:

SerialPort sp = new SerialPort();
sp.PortName = "COM3";
sp.BaudRate = 9600;
sp.Parity = Parity.None;
sp.DataBits = 8;
sp.StopBits = StopBits.One;
sp.Open();
byte[] bytestosend = { 0x1B, byte.Parse("?"), 0x1B, 0xA2, byte.Parse("748"), 0x0D, 0x1B, 0xA3, byte.Parse("1200,00"), 0x0D, 0x1B, 0xA4, byte.Parse("11/10/2019"), 0x0D, 0x1B, 0xA1, byte.Parse("CHICOBEL"), 0x0D, 0x1B, 0x1B, 0xB0, 0x0D };

sp.Write(bytestosend, 0, bytestosend.Length);

ZurdoDev

Какая строка вызывает ошибку?

phil.o

Чего вы ожидаете от таких фрагментов как byte.Parse("?") или byte.Parse("11/10/2019") производить?
byte соответствует беззнаковому 8-битному значению, вы ничего не можете туда поместить.

3 Ответов

Рейтинг:
28

Richard MacCutchan

byte.Parse("1200,00")
byte.Parse("CHICOBEL")

Байт.Метод Синтаксического Анализа (Система) | Microsoft Docs[^] принимает только целочисленные значения в строке.


TheRealSteveJudge

5*, но также должен соблюдаться допустимый диапазон от 0 до 255.

Richard MacCutchan

Спасибо, что обратили на это внимание.

Рейтинг:
1

TheRealSteveJudge

Каждое из этих выражений вызывает исключение:

byte.Parse("?")
byte.Parse("748")
byte.Parse("1200,00")
byte.Parse("11/10/2019")
byte.Parse("CHICOBEL")

например, байт.Parse ("748") приводит к тому, что значение 'было либо слишком большим, либо слишком маленьким для байта без знака.

например, байт.Синтаксический анализ("CHICOBEL") результаты в 'входная строка не была в неправильном формате.

Каждый аргумент должен быть числом, которое вписывается в тип unsigned byte.

"? "- это не число
"1200,00" - это число, но слишком большое
"11/10/2019" - это не число
"ЧИКОБЕЛЬ" - это не число
"748" - это число, но слишком большое

Как Байтовая структура в C# - GeeksforGeeks[^] говорит, что байт может содержать число от 0 до 255.

Для того, чтобы разделить любой тип данных байт, вы можете использовать класс bitconverter :
Класс BitConverter (System) | Microsoft Docs[^]


Gilcecler Carneiro

в java я делаю для
в C # команда write не печатает байт за байтом?

кроме шестнадцатеричных команд мне нужно посылать байт за байтом значения "1200.00", "748" и т. д

//ява
stValue = "748"; //Banco

btCmds[1] = (байт)0xA2;

btCmds[0] = 0x1B;

for(wdCnt=0;wdCnt < stValue.длина() ;wdCnt++ )

{ btCmds[wdCnt+2] = stValue.getBytes()[wdCnt]; }

btCmds[wdCnt+2] = 0x0D;

szCmds = wdCnt+3;

для(число типа int = 0;счетчик &ЛТ; szCmds; счетчик ++) //следующих данных

последовательный порт.writeByte(btCmds[счетчик]);



stValue = "123456,00"; //доблесть

obReg.Valor = stValue;

btCmds[1] = (байт)0xA3;

btCmds[0] = 0x1B;

for(wdCnt=0;wdCnt < stValue.длина() ;wdCnt++ )

{ btCmds[wdCnt+2] = stValue.getBytes()[wdCnt]; }

btCmds[wdCnt+2] = 0x0D;

szCmds = wdCnt+3;

для(число типа int = 0;счетчик &ЛТ; szCmds; счетчик ++) //следующих данных

последовательный порт.writeByte(btCmds[счетчик]);

TheRealSteveJudge

Если вы внимательно прочтете код Java, то обнаружите, что используется метод "getBytes".
Это преобразует, например, '123456,00' в массив байтов.
Вы должны сделать то же самое с помощью класса BitConverter

https://docs.microsoft.com/en-us/dotnet/api/system.bitconverter?view=netframework-4.8

Gilcecler Carneiro

@TheRealSteveJudge - очень важное ваше замечание, очень помогло мне, спасибо :)

Gilcecler Carneiro

хммм, должен ли я сделать то же самое сохранение цикла в матрице? Я постараюсь

Рейтинг:
1

Gilcecler Carneiro

правильно ли это ?

не входил в течение


SerialPort sp = new SerialPort();
                sp.PortName = "COM3";
                sp.BaudRate = 9600;
                sp.Parity = Parity.None;
                sp.DataBits = 8;
                sp.StopBits = StopBits.One;
                sp.Open();
                
                byte[] btCmds = new byte[200];

                btCmds[1] = 0xA3;
                btCmds[0] = 0x1B;

                stValue = "123456,00"; //Valor
                MessageBox.Show("tamanho " + stValue.Length);

                for (wdCnt = 0; wdCnt < stValue.Length; wdCnt++)
                {
                    stValuep=stValue.Substring(wdCnt);
                    MessageBox.Show("substring  " + stValuep);
                    
                        
                    btCmds[wdCnt + 2] = byte.Parse(stValuep); 
                }

                               
                btCmds[wdCnt + 2] = 0x0D;

                szCmds = wdCnt + 3;

                //for (int Count = 0; Count < szCmds; Count++)   //Envia Dados

                MessageBox.Show("vetor byte " + btCmds);

                    sp.Write(btCmds, 0, btCmds.Length);


Richard MacCutchan

Нет, это не правильно, вам нужно добавить значение длины к stValue.Вызов подстроки:
stValuep=stValue.Substring(wdCnt, 1);
Однако это все равно не удастся, когда он попытается разобрать запятую. Кроме того, неясно, в каком именно формате должно быть значение, когда оно передается на устройство последовательного порта, и это вполне может иметь решающее значение.

Gilcecler Carneiro

*************************************************************
Руководство По Эксплуатации Принтера

Функция: команда / формат (шестнадцатеричный):
Отправить значение для печати 1Bh A3h 'VALUE' 0Dh
*******************************************************
например:
Я хочу сообщить о стоимости $ 1200.00
Мне нужно отправить сообщение "."



stValue = "1200.00"; //доблесть

for (wdCnt = 0; wdCnt < stValue.Длина; wdCnt++)
{
stValuep=stValue.Подстрока(wdCnt);
Ящик для сообщений.Show("substring" + stValuep);
btCmds[wdCnt + 2] = байт.Разбор(stValuep);
}

btCmds[wdCnt + 2] = 0x0D;