Прежде всего, я рекомендую использовать следующий конструктор вместо того, который вы используете в данный момент:
new SerialPort("COM10", 115200, Parity.None, 8, StopBits.One);
Далее вы действительно должны удалить этот код:
// Wait 10 Seconds for data...
for (int i = 0; i < 1000; i++)
{
Thread.Sleep(10);
Console.WriteLine(sp.Read(buf,0,bufSize)); //prints data directly to the Console
}
И вместо этого просто зацикливайтесь, пока пользователь не нажмет клавишу или что-то вроде этого:
namespace serialPortCollection
{ class Program
{
static void Main(string[] args)
{
SerialPort sp = new SerialPort("COM10", 115200);
sp.DataReceived += port_OnReceiveDatazz; // Add DataReceived Event Handler
sp.Open();
sp.WriteLine("$"); //Command to start Data Stream
Console.ReadLine();
sp.WriteLine("!"); //Stop Data Stream Command
sp.Close();
}
// My Event Handler Method
private static void port_OnReceiveDatazz(object sender,
SerialDataReceivedEventArgs e)
{
SerialPort spL = (SerialPort) sender;
byte[] buf = new byte[spL.BytesToRead];
Console.WriteLine("DATA RECEIVED!");
spL.Read(buf, 0, buf.Length);
foreach (Byte b in buf)
{
Console.Write(b.ToString());
}
Console.WriteLine();
}
}
}
Кроме того, обратите внимание на изменения в обработчике событий полученных данных, теперь он должен фактически напечатать буфер.
ОБНОВЛЕНИЕ 1
Я только что успешно выполнил следующий код на моей машине (используя нуль-модемный кабель между COM33 и COM34)
namespace TestApp
{
class Program
{
static void Main(string[] args)
{
Thread writeThread = new Thread(new ThreadStart(WriteThread));
SerialPort sp = new SerialPort("COM33", 115200, Parity.None, 8, StopBits.One);
sp.DataReceived += port_OnReceiveDatazz; // Add DataReceived Event Handler
sp.Open();
sp.WriteLine("$"); //Command to start Data Stream
writeThread.Start();
Console.ReadLine();
sp.WriteLine("!"); //Stop Data Stream Command
sp.Close();
}
private static void port_OnReceiveDatazz(object sender,
SerialDataReceivedEventArgs e)
{
SerialPort spL = (SerialPort) sender;
byte[] buf = new byte[spL.BytesToRead];
Console.WriteLine("DATA RECEIVED!");
spL.Read(buf, 0, buf.Length);
foreach (Byte b in buf)
{
Console.Write(b.ToString() + " ");
}
Console.WriteLine();
}
private static void WriteThread()
{
SerialPort sp2 = new SerialPort("COM34", 115200, Parity.None, 8, StopBits.One);
sp2.Open();
byte[] buf = new byte[100];
for (byte i = 0; i < 100; i++)
{
buf[i] = i;
}
sp2.Write(buf, 0, buf.Length);
sp2.Close();
}
}
}
ОБНОВЛЕНИЕ 2
Учитывая весь трафик по этому вопросу в последнее время. Я начинаю подозревать, что либо ваш последовательный порт не настроен должным образом, либо устройство не отвечает.
Я настоятельно рекомендую вам попытаться установить связь с устройством другими способами (я часто использую гипертерминал). Затем вы можете поиграть со всеми этими настройками (битрейт, четность, биты данных, стоп-биты, управление потоком), пока не найдете набор, который работает. В документации на устройство также должны быть указаны эти настройки. Как только я это выяснил, я убедился, что мой .NET SerialPort правильно настроен для использования этих настроек.
Некоторые советы по настройке последовательного порта:
Обратите внимание, что когда я сказал, что вы должны использовать следующий конструктор, я имел в виду, что используйте эту функцию, а не обязательно эти параметры! Вам необходимо ввести параметры для вашего устройства, приведенные ниже настройки являются общими, но могут отличаться для вашего устройства.
new SerialPort("COM10", 115200, Parity.None, 8, StopBits.One);
Также важно, чтобы вы настроили .NET SerialPort на использование того же управления потоком, что и на вашем устройстве (как уже говорили другие люди). Вы можете найти больше информации здесь:
http://www.lammertbies.nl/comm/info/RS-232_flow_control.html