Связь через COM-порт с Virtual PC (часть 2) - PullRequest
1 голос
/ 05 февраля 2011

Этот вопрос относится к моему более раннему вопросу .

Соединение с каналом теперь успешно, но я все еще не могу прочитать (или записать) какие-либо данные из порта.

Мое первое предположение было, что данные буферизируются.Но даже когда я пишу (на клиентском сайте) 5000 байт (размер буфера в NamedPipeClientStream составляет 512 байт), я не получаю никаких данных.

PipeOptions.WriteThrough тоже ничего не изменил.

Когда я использую не канал, а текстовый файл (в настройках Virtual-PC) для перенаправления данных, записанных в COM-порт, данные записываются, как и ожидалось, в текстовый файл.Итак, программа тестирования клиента, работающая на Virtual-PC, работает нормально.Вероятно, проблема в моем коде ниже.

var pipe = new NamedPipeClientStream(".", "mypipe", PipeDirection.InOut, PipeOptions.WriteThrough);

pipe.Connect();

// this is blocking
int i = pipe.ReadByte();

var reader = new StreamReader(pipe);
// this is blocking, too
var s = reader.ReadLine();

Обновление:

Код, который я запускаю на гостевой ОС:

var port = new SerialPort("COM1");
port.Open();

port.WriteLine("Hallo");

Использование 'echo' в командной строке, как предложил telewin, работает нормально.В чем разница между отображением и использованием приведенного выше кода?

1 Ответ

1 голос
/ 12 февраля 2011

Извините за поздний ответ, надеюсь, он все еще актуален ...

В моих тестах "echo hello> com1" работает только до , когда вы запускаете свою программу (которая запускает новый SerialPort) внутри VPC. После того, как вы запустите его, «echo hello> com1» больше не будет виден хост-программой, пока гость не будет перезагружен.

Это говорит о том, что инициализация самого SerialPort делает что-то постоянное. Используя Reflector, мы обнаруживаем, что ctor SerialPort не имеет никаких последствий, но его метод Open вызывает ctor для SerialStream. Этот ctor делает совсем немного: он устанавливает буферы чтения / записи, Rts / Dtr и режим рукопожатия. После некоторых испытаний кажется, что Rts / Dtr испортил "echo hello> com1". Можете ли вы попробовать этот модифицированный код внутри VPC:

var port = new SerialPort("com1");
port.DtrEnable = true;
port.RtsEnable = true;
port.Open();
port.WriteLine("Hallo");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...