Я пишу команды на ремне принтера с использованием opennetcf.io.ports.serialport Таким образом: < /p>
public static bool SendCommandToPrinter(string cmd)
{
bool success; // init'd to false by default
try
{
SerialPort serialPort = new SerialPort();
serialPort.BaudRate = 19200;
serialPort.Handshake = Handshake.XOnXOff;
serialPort.Open();
serialPort.Write(cmd);
serialPort.Close();
success = true;
}
catch // may not need a try/catch block, as success defaults to false
{
success = false;
}
return success;
}
< /code>
... теперь мне нужно прочитать значение, возвращаемое из звонка «получить Val», но я не знаю, как, и я не смог найти, как, сделать это. У меня есть следующее начало, но я не знаю, как «заполнить бланк»: < /p>
string getDeviceLang = string.Format("! U1 getvar {0}device.languages{0}", quote);
public static string GetSettingFromPrinter(string cmd)
{
string settingVal = string.Empty;
SerialPort serialPort = new SerialPort();
serialPort.BaudRate = 19200;
serialPort.Handshake = Handshake.XOnXOff;
serialPort.Open();
serialPort.Write(cmd); // do I even need this call to write?
settingVal = serialPort.Read() // ???
serialPort.Close();
return settingVal;
}
< /code>
opennetcf.io.ports.serialport's read () метод принимает массив байтов («буфер»), за которым следует int («смещение») и еще один int («count») и возвращает int. Я не знаю, что использовать в качестве ARG или что делать с результатом Int.public static string GetSettingFromPrinter(string cmd)
{
string settingVal = string.Empty;
try
{
SerialPort serialPort = new SerialPort();
serialPort.BaudRate = 19200;
serialPort.Handshake = Handshake.XOnXOff;
serialPort.Open();
serialPort.Write(cmd);
// testing...
settingVal = serialPort.ReadLine();
serialPort.Close();
return settingVal;
}
catch (Exception x)
{
MessageBox.Show(x.ToString());
return settingVal;
}
}
< /code>
..., но это вознаграждает меня меньшим количеством, чем поставлен, "System.notsupportedException: еще не opennetcf.ip.ports.serialport.readto (string value) AT ..." < /p>
update. />
serialPort.ReadTimeout = 500;// made no difference
< /code>
обновление 3 < /h2>
На основе этого я попытался заставить его работать таким образом: < /p>
public class PrintUtils
{
static SerialPort _serialPort;
static bool keepReading = true;
static string settingVal = string.Empty;
. . .
public static string GetSettingFromPrinter(string cmd)
{
Thread readThread = new Thread(ReadSetting());
try
{
_serialPort = new SerialPort();
_serialPort.BaudRate = 19200;
_serialPort.Handshake = Handshake.XOnXOff;
_serialPort.Open();
while (keepReading)
{
_serialPort.WriteLine(cmd);
}
_serialPort.Close();
return settingVal;
}
catch (Exception x)
{
MessageBox.Show(x.ToString());
return settingVal;
}
}
public static void ReadSetting()
{
while (keepReading)
{
try
{
settingVal = _serialPort.ReadLine();
keepReading = settingVal.Equals(string.Empty);
}
catch (Exception ex) { MessageBox.Show(ex.ToString());}
}
}
< /code>
...but i get, " method 'pdaclient.printutils.read ()' ссылки на ссылки без скобок < /em>" На этой строке: < /p>
Thread readThread = new Thread(Read);
< /code>
Если я do < /em> дайте это при парену: < /p>
Thread readThread = new Thread(ReadSetting());
< /code>
...it сообщает мне: « аргумент '1': не может преобразовать из 'void' в system.threading.threadstart '< /em>" < /p>
и: < /p>
System.Threading.Thread.Thread (System.Threading.ThreadStart) 'имеет некоторые неверные аргументы < /em> "< /p>
Обновление 4 < /h2>
и с этим кодом: < /p>
public static string GetSettingFromPrinter(string cmd)
{
string setting = string.Empty;
byte[] buffer = null;
try
{
SerialPort serialPort = new SerialPort();
serialPort = new SerialPort();
serialPort.BaudRate = 19200;
serialPort.Handshake = Handshake.XOnXOff;
serialPort.ReadTimeout = 500;
serialPort.Open();
serialPort.Write(cmd);
setting = Convert.ToString(serialPort.Read(buffer, 0, buffer.Length));
serialPort.Close();
return setting;
}
catch (Exception x)
{
MessageBox.Show(x.ToString());
return setting;
}
}
< /code>
Я получаю nre. < /p>
Обновление 5 < /h2>
Эта попытка: < /p>
serialPort.WriteLine(cmd);
setting = serialPort.ReadExisting();
< /code>
.....ders очень сходство с первым обновлением ("System.notsupportedException: еще не opennetcf.ip.ports.serialport.readexisting () At ...") < /p>
обновление 6 < /h2>
ok ok, i incorport in in in in in in in in in in in in in inpust 6 < /h2>
Комментарий Ctacke, и теперь я получил это: < /p>
const string quote = "\"";
. . .
string getDeviceLang = string.Format("! U1 getvar {0}device.languages{0}", quote);
. . .
String deviceLanguage = PrintUtils.GetSettingFromPrinter(getDeviceLang);
public static string GetSettingFromPrinter(string cmd)
{
string setting = string.Empty;
try
{
SerialPort serialPort = new SerialPort();
serialPort = new SerialPort();
serialPort.BaudRate = 19200;
serialPort.Handshake = Handshake.XOnXOff;
serialPort.ReadTimeout = 500;
serialPort.Open();
serialPort.WriteLine(cmd); // or Write()
// get a synchronous, newline-delimited response
StringBuilder response = new StringBuilder();
char c;
do
{
c = (char)serialPort.ReadByte();
response.Append(c);
} while(c != '\n');
serialPort.Close();
return setting;
}
catch (Exception x)
{
MessageBox.Show(x.ToString());
return setting;
}
< /code>
... но это «висит» - кажется, в Do ... while while. < /p>
Обновление 7 < /h2>
Я добавил это после «readbyte»: < /p>
.MessageBox.Show(c.ToString());
< /code>
... и все, что он мне показывает, - это ничто (ящик для сообщений без "внутреннего текста"); Я позволил этому всплыть 32 раза, прежде чем я согревал устройство. Поэтому я пытаюсь и иметь это, основываясь на предоставленном псевдокоде Ctacke. Я сейчас пытаюсь использовать: < /p>
Port serialPort = new Port();
serialPort.Settings = whateverPortSettingsYouNeed;
serialPort.Open();
serialPort.Send(cmd);
< /code>
... но я не знаю, каким должен быть «какой -либо портсеттингсин», нет метода «отправить», и я не знаю, что использовать вместо reartbyte () < /p>
обновление 9 < /h2>
i aff This Settings: < /p>
I. I Shat That Strets: < /p>
I.BasicPortSettings bps = new BasicPortSettings();
bps.BaudRate = 19200;
//bps.ByteSize = ?;
//bps.Parity = None;
//bps.StopBits = 1;
Port serialPort = new Port();
serialPort.Settings = bps;
< /code>
...but, как вы можете видеть, я не знаю, какими должны быть большинство значений.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; //bps.StopBits.one;
Port serialPort = new Port("COM1:", bps);
byte[] outputBytes = System.Text.Encoding.ASCII.GetBytes(cmd);
serialPort.Output = outputBytes;
serialPort.Open();
byte[] bites = serialPort.Input;
setting = bites.ToString();
serialPort.Close();
return setting;
}
catch (Exception x)
{
MessageBox.Show(x.ToString());
return setting;
}
}
< /code>
...now я посмотрю, действительно ли это работает ... < /p>
Обновление 11 < /h2>
Я обнаружил (жесткий путь), что мне пришлось открыть порт перед установкой выходной вал; СЕЙЧАС: < /p>
serialPort.Open();
byte[] outputBytes = Encoding.ASCII.GetBytes(cmd);
serialPort.Output = outputBytes;
byte[] inputBytes = serialPort.Input;
setting = inputBytes.ToString();
< /code>
.... но что считывается в настройке "system.byte []" < /p>
Что мне нужно, чтобы на самом деле получить значение при вводах, а не просто увидеть представление его типа? < /p>
Подробнее здесь: https://stackoverflow.com/questions/241 ... serialport
Как я могу прочитать строку от opennetcf.io.ports.serialport? ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Ошибка System.IO.Ports и .NET7: «System.IO.Ports в настоящее время поддерживается в Windows»
Anonymous » » в форуме C# - 0 Ответы
- 22 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Ошибка System.IO.Ports и .NET7: «System.IO.Ports в настоящее время поддерживается в Windows»
Anonymous » » в форуме C# - 0 Ответы
- 18 Просмотры
-
Последнее сообщение Anonymous
-