Здравствуйте, curvex, Вы писали:
C>Здравствуйте, Andrej-V, Вы писали:
AV>>>>А как в NET SerialPort определяет сколько байт прочитать: один, два, десять?
C>>>Думаю, что никак.
AV>>Я предполагал, что как-то используется какое-то время считывания или считывается определенное кол-во байт. Но или алгоритм более сложный (непонятно зачем) или определяется во время считывания какая-то другая величина (например, заканчивается время обработки сообщения — заканчивается считывание). Но не квантовая же механика пролезла в алгоритмы.
AV>>Хотя судя по вашему ответу — это вопрос не практического сорта.
C>SerialPort ждет _любое_ отличное от нуля количество байт в течении времени заданного ReadTimeout. Если хотя бы один байт пришел, его и вернет. Если не пришло ни одного байта — кинет TimeoutException.
Леонид. Я не понимаю. Приходит всегда сначала один байт (потом, возможно, 2-й. 3-й и т.д.).
Значит и считываться должен только один байт. А если несколько, то должен быть алгоритм: сколько байт еще подождать, сколько времени. Но время ReadTimeout не выжидается... Похоже на детскую задачку: сколько байт придет в ответ, если ...(а условие не задано). Тогда должно всегда — один (первый).
Следующая программка демонстрирует что ReadTimeout — время, в течение которого возможно считывание с порта. Здесь, наконец, время не меньше ReadTimeout. Но не понимаю куда девается буква A: в ответе на команду ATZ приходит TZ.
using System;
using System.Text;
using System.IO.Ports;
using System.Threading;
namespace ConsoleApplication5
{
class Program
{
static string RecvString(SerialPort com)
{
byte[] MyArray = new byte[1];
string s = "";
System.Text.ASCIIEncoding oEncoder = new ASCIIEncoding();
try
{
while (com.Read(MyArray, 0, 1) == 1) if (s != "") s += oEncoder.GetString(MyArray); else s += "!";
return s;
}
catch (TimeoutException e)
{
return s;
}
catch (Exception e)
{
s = "";
return s;
}
}
static void Main(string[] args)
{
SerialPort com = new SerialPort("COM1", 115200, Parity.None, 8, StopBits.One);
if (com.IsOpen) com.Close();
com.ReadTimeout = 3000;
com.WriteTimeout = 1400;
com.DtrEnable = true;
com.Open();
Thread.Sleep(1500);
com.Write("ATZ\r\n");
// Thread.Sleep(500);
DateTime dt1 = DateTime.Now;
string s = RecvString(com);
TimeSpan ts = DateTime.Now — dt1;
Console.WriteLine("Ответ: "+s+" Время: "+ts.TotalMilliseconds.ToString());
com.Close();
Console.ReadLine();
}
}
}
C>Вообще, есть такая программка: PortMon.
C>Показывает байтики передаваемые и принимаемые последовательным портом (точнее его драйвером), команды отправляемые ему приложением и проч. В том числе показывает время этих событий, и, насколько я помню, использует таймер с более высоким разрешением для замера интервалов. Попробуйте ее.
Спасибо, но скачать ее сейчас невозможно: что-то сгорело на АТС, еле-еле с 3- 4 -й попытки на 9600 соединяюсь с провайдером и если успеваю до разрыва связи прочитать свою ветку — уже почти счастье.
Спасибо за ответы.