Я пытаюсь написать приложение C #, которое считывает данные UART со скоростью 115200 бит / с. Данные в формате:
ID: XXX Data: XX XX XX XX XX XX XX XX
ID: XXX Data: XX XX XX XX XX XX XX XX
ID: XXX Data: XX XX XX XX XX XX XX XX
где X представляют шестнадцатеричные значения.
Каждая передача заканчивается символом новой строки ('\ n'). Ниже приведен код моего приложения C #. Он просто считывает данные построчно, разбирает ID и поля данных в переменные, а затем вставляет данные в объект dataGridView. Если запись идентификатора не существует в таблице, она и ее данные добавляются. Если запись идентификатора уже существует (повторяется), то существующие данные для повторяющейся записи идентификатора обновляются новыми данными. Это позволяет мне видеть, как меняются данные в перечисленных идентификаторах.
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
serialPort.PortName = "COM11";
serialPort.BaudRate = 115200;
serialPort.Open();
serialPort.DiscardOutBuffer();
serialPort.DiscardInBuffer();
}
private delegate void SetTextDeleg(string text);
private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
string CAN_tx = serialPort.ReadLine();
this.BeginInvoke(new SetTextDeleg(processCAN), new object[] { CAN_tx });
}
void processCAN(string CAN_tx)
{
CANout_txtbox.Text = CAN_tx;
Match match = Regex.Match(CAN_tx, @"^ID:\s([A-F0-9]+)\s+Data:\s([^\r]+)", RegexOptions.IgnoreCase);
if (!match.Success) return;
string pid = match.Groups[1].Value.Trim();
string data = match.Groups[2].Value.Trim();
string raw = pid + " " + data;
string[] row = raw.Split(' ');
int rowIndex = -1;
try
{
DataGridViewRow matchRow = dataTable.Rows
.Cast<DataGridViewRow>()
.Where(r => r.Cells["PID"].Value.ToString().Equals(match.Groups[1].Value))
.First();
rowIndex = matchRow.Index;
}
catch { }
if (rowIndex != -1)
{
dataTable.Rows[rowIndex].SetValues(row);
}
else
{
dataTable.Rows.Add(row);
}
}
}
}
Программа работает, однако, похоже, есть проблемы с производительностью последовательной связи. Когда я просматриваю поток данных в консоли, я вижу, что в секунду отправляется несколько сотен идентификаторов. (Идентификатор повторяется каждые 10, 20, 50, 100, 110 мс, в зависимости от идентификатора) Когда я просматриваю данные в приложении C #, я вижу, может быть, 50 идентификаторов в секунду. Это приводит к огромной задержке между отправкой данных в приложение C # и обновлением данных в приложении C #.
Есть ли способ установить приоритет для COM-порта, который я использую? Или здесь есть более глубокие проблемы? Я попытался уменьшить размер последовательного буфера, изменить таймауты и количество байтов, необходимых для запуска события приема данных, но ничего не изменилось.
Я уже начал новый подход в Python, поскольку я мог отображать данные почти в реальном времени, однако я хотел бы понять, что происходит в моем приложении C #, что снижает производительность, которая мне нужна.
Спасибо!
stdout
. Посмотрите, как быстро этот вывод может отображаться на консоли. Перезапустите программу и перенаправьтеstdout
в файл. (2) Вырежьте обрабатывающую часть, но прочтите изstdin
(например, из файла). - person sawdust   schedule 13.05.2014