Я пытаюсь отправить команду "getvar" на принтер через последовательный порт и получить ответ, но все, что я получаю, пытаясь проверить, что я отправляю, и то, что получено: "System.Byte [ ]"
Вот мой код:
const string quote = "\"";
. . .
string getDeviceLang = string.Format("! U1 getvar {0}device.languages{0}", quote);
. . .
String deviceLanguage = PrintUtils.GetSettingFromPrinter(getDeviceLang);
. . .
MessageBox.Show(deviceLanguage); // <= this shows "System.Byte[]"
public static string GetSettingFromPrinter(string cmd)
{
string setting = string.Empty;
try
{
BasicPortSettings bps = new BasicPortSettings();
bps.BaudRate = BaudRates.CBR_19200;
bps.Parity = OpenNETCF.IO.Serial.Parity.none;
bps.StopBits = OpenNETCF.IO.Serial.StopBits.one;
Port serialPort = new Port("COM1:", bps);
serialPort.Open();
byte[] outputBytes = Encoding.ASCII.GetBytes(cmd);
MessageBox.Show(Convert.ToString(outputBytes)); // <= this shows "System.Byte[]"
serialPort.Output = outputBytes;
byte[] inputBytes = serialPort.Input;
setting = Convert.ToString(inputBytes);
serialPort.Close();
return setting;
}
catch (Exception x)
{
MessageBox.Show(x.ToString());
return setting;
}
}
Что мне нужно сделать, чтобы фактически увидеть строку, которую я передаю и получаю, а не просто строковое представление типа данных?
Правильно ли это выглядит так:
setting = System.Text.Encoding.ASCII.GetString(
inputBytes, 0, inputBytes.Length);
? Он, по крайней мере, компилируется, но...
Хорошо, этот код:
public static string GetSettingFromPrinter(string cmd)
{
string setting = string.Empty;
try
{
BasicPortSettings bps = new BasicPortSettings();
bps.BaudRate = BaudRates.CBR_19200;
bps.Parity = OpenNETCF.IO.Serial.Parity.none;
bps.StopBits = OpenNETCF.IO.Serial.StopBits.one;
Port serialPort = new Port("COM1:", bps);
serialPort.Open();
byte[] sendBytes = Encoding.ASCII.GetBytes(cmd);
MessageBox.Show(Encoding.ASCII.GetString(sendBytes, 0,
sendBytes.Length));
serialPort.Output = sendBytes;
byte[] receiveBytes = serialPort.Input;
setting = GetString(receiveBytes);
serialPort.Close();
return setting;
}
catch (Exception x)
{
MessageBox.Show(x.ToString());
return setting;
}
}
... возвращает возвращаемый val (! U1 getvar "device.language") здесь:
MessageBox.Show(Encoding.ASCII.GetString(sendBytes, 0, sendBytes.Length));
... но все равно пустая строка здесь:
String deviceLanguage = PrintUtils.GetSettingFromPrinter(getDeviceLang);
MessageBox.Show(deviceLanguage);
// Helper function, from http://stackoverflow.com/questions/472906/converting-a-string-to-byte-array
static string GetString(byte[] bytes)
{
char[] chars = new char[bytes.Length / 2];
System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
return new string(chars);
}
Может быть, "sendBytes" просто не отправляются, и почему нет ответа/ничего в receiveBytes...
Если вы хотите увидеть байты в шестнадцатеричной форме, просто используйте BitConverter.ToString(byte[])
. Это даст вам выход, такой как "01-56-AF".
Если вы хотите текст - ну, у вас есть это уже как cmd
- но в общем случае для преобразования byte[]
в текст, который он представляет, используйте Encoding.GetString(bytes)
используя подходящую кодировку.
По сути, нет никакого "фактического строкового значения" для байтового массива - существует много разных способов преобразования произвольного массива байтов в текст, и вам нужно выбрать правильный подход для вашего контекста.
+ Изменить
setting = Convert.ToString(inputBytes);
в
setting = System.Text.Encoding.ASCII.GetString(inputBytes);
cmd
? Обычный текст вместо байтов?Convert.ToString()
- это не то, что вам нужно для преобразования двоичного текста в текстовое - вам нуженEncoding.GetString
.