Работа с несколькими COM портами: переписать код для работы с одним - C#
Формулировка задачи:
в общем необходима программа для опроса нескольких компортов. есть код, но он работает для нескольких компортов. а вот у меня ОДИН компорт и на него надо слать несколько значений. кто работал, отзовитесь, помогите советом\кодом
#region com
private void SelectCom() //com port
{
try
{
NpgsqlConnection conn = new NpgsqlConnection(("Server=" + list[0] + ";Port=" + list[1] + ";User Id=" + list[2] + ";Password=" + list[3] + ";Database=" + list[4] + ";")); //
string sql = "SELECT \"ID_TagName\", \"F_ComPort\", \"F_ComPortBaudRate\", \"F_ComQuery\", \"F_ParseFunction\", \"F_TagReadTime\", \"F_AnswerLenght\", \"F_AnswerKey\", ";
sql += "\"F_AnswerKeyPosition\", \"F_ComPortIPAdress\", \"F_ComPortParity\", \"F_ComPortDataBits\", \"F_ComPortStopBit\", \"F_ComPortFlowControl\", ";
sql += "\"F_ComPortTimeOut\" FROM \"SC_Tag\".\"T_TagName\" as tn,\"SC_Tag\".\"T_HardWareTag\" as hw , \"SC_Tag\".\"T_RealHardWare\" as rh where ";
sql += "rh.\"ID_RealHardWare\" = hw.\"F_RealHardWare_ID\" and tn.\"F_HardWare_ID\" = hw.\"F_TagName_ID\" and \"F_ServerName\" =\'" + Environment.MachineName + "\' and \"F_ComPortIPAdress\" = '127.0.0.1' ";
NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
ds.Reset();
da.Fill(ds);
dt = ds.Tables[0];
if (ds.Tables[0] != null)
{
InitAll();
}
}
catch (Exception msg)
{
logger.Trace(msg);
return;
}
}
private void InitAll()
{
try
{
allListeners = new List<MyComReader>();
for (int xx = 0; xx < ds.Tables[0].Rows.Count; ++xx)
{
string com = "COM" + dt.Rows[xx][1];
string send = dt.Rows[xx][3].ToString() + "\r";
string idcom = dt.Rows[xx][0].ToString();
int BaudRate = Convert.ToInt32(dt.Rows[xx][2]);
char key = Convert.ToChar(dt.Rows[xx][7]);
string parity = dt.Rows[xx][10].ToString();
int databit = Convert.ToInt32(dt.Rows[xx][11]);
double stopbit = Convert.ToDouble(dt.Rows[xx][12]);
string flowcontrol = dt.Rows[xx][13].ToString();
int timeout = Convert.ToInt32(dt.Rows[xx][14]);
string parseFunc = dt.Rows[xx][4].ToString();
allListeners.Add(new MyComReader(com, BaudRate, send, idcom, parity, databit, stopbit, flowcontrol, timeout, parseFunc, key));
}
min = Convert.ToInt32(dt.Rows[0][5]);
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
if (Convert.ToInt32(dt.Rows[i][5]) < min)
min = Convert.ToInt32(dt.Rows[i][5]);
}
this.timer2 = new System.Timers.Timer();
this.timer2.Enabled = true;
this.timer2.Interval = min;
this.timer2.Elapsed += new System.Timers.ElapsedEventHandler(this.timer2_Elapsed);
this.timer2.AutoReset = true;
this.timer2.Start();
}
catch (Exception msg)
{
logger.Trace(msg);
return;
}
}
private void timer2_Elapsed(object sender, EventArgs e)
{
try
{
Go();
}
catch (Exception msg)
{
logger.Trace(msg);
throw;
}
}
private void Go()
{
try
{
foreach (MyComReader comListener in allListeners)
{
comListener.ThreadStart();
Thread.Sleep(1000);
if (comListener.ThreadState())
comListener.ThreadStop();
}
}
catch (Exception msg)
{
logger.Trace(msg);
return;
}
}
#endregionРешение задачи: «Работа с несколькими COM портами: переписать код для работы с одним»
textual
Листинг программы
#region mycom
internal class MyComReader
{
// private SerialPort port;
private System.Timers.Timer timer;
private System.Threading.Thread thread;
readonly EventWaitHandle wh = new AutoResetEvent(false);
private bool doWork;
// int i = 0;
string value = "";
private string inData = "";
SerialPort _COM;
string DataToSend;
string IdCom;
string ParseGlob = "";
char Key;
internal MyComReader(string portNumber, int bodRate, string dataTosend, string idcom, string parity, int databit, double stopbit, string flowcontrol, int timeout, string parse, char key)
{
IdCom = idcom;
DataToSend = dataTosend;
Key = key;
_COM = new SerialPort(portNumber, bodRate);
if (parity.ToLower() == "none")
_COM.Parity = System.IO.Ports.Parity.None;
else if (parity.ToLower() == "even")
_COM.Parity = System.IO.Ports.Parity.Even;
else if (parity.ToLower() == "mark")
_COM.Parity = System.IO.Ports.Parity.Mark;
else if (parity.ToLower() == "odd")
_COM.Parity = System.IO.Ports.Parity.Odd;
else if (parity.ToLower() == "space")
_COM.Parity = System.IO.Ports.Parity.Space;
_COM.DataBits = databit;
if (stopbit == 0)
_COM.StopBits = StopBits.None;
else if (stopbit == 1)
_COM.StopBits = StopBits.One;
else if (stopbit == 1.5)
_COM.StopBits = StopBits.OnePointFive;
else if (stopbit == 2)
_COM.StopBits = StopBits.Two;
if (flowcontrol.ToLower() == "none")
_COM.Handshake = Handshake.None;
else if (flowcontrol.ToLower() == "rts/cts" || flowcontrol.ToLower() == "rts\\cts")
_COM.Handshake = Handshake.RequestToSend;
else if (flowcontrol.ToLower() == "xon/xof" || flowcontrol.ToLower() == "xon\\xof")
_COM.Handshake = Handshake.RequestToSendXOnXOff;
else if (flowcontrol.ToLower() == "dtr/dsr" || flowcontrol.ToLower() == "dtr\\dsr")
_COM.Handshake = Handshake.XOnXOff;
_COM.ReadTimeout = timeout;
_COM.WriteTimeout = timeout;
if (parse != "")
ParseGlob = parse;
_COM.DataReceived += port_DataReceived;
}
public void ThreadStart()
{
doWork = true;
thread = new Thread(Execute);
thread.Start();
this.timer = new System.Timers.Timer();
this.timer.Enabled = true;
this.timer.Interval = min;
this.timer.Elapsed += new System.Timers.ElapsedEventHandler(this.timer_Elapsed);
this.timer.AutoReset = true;
this.timer.Start();
}
public void ThreadStop()
{
doWork = false;
timer.Stop();
wh.Set();
_COM.Close();
}
public bool ThreadState()
{
if (doWork)
return true;
else return false;
}
void Execute()
{
try
{
while (doWork)
{
if (_COM.IsOpen)
{
// Если порт открыт, значит какой-то косяк, девайс не ответил, здесь обрабатываем
// Закрываем
_COM.Close();
}
// Открываем
_COM.Open();
_COM.Write(DataToSend);
wh.WaitOne();
}
}
catch (Exception msg)
{
logger.Debug("Execute() " + msg);
return;
}
}
void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
wh.Set();
}
void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
////////////
SerialPort sp = (SerialPort)sender;
inData += sp.ReadExisting();
value = inData;
// if (value.Length == 14 && value.Length < 15 && value.Contains("\r"))
if (value[0] == Key && value.Length == 14 && value.Contains("\r"))
{
value = value.Substring(0, value.Length - 1);
// Пришли данные
// string IdCom = "2";
// Чето с ними делаем
NpgsqlConnection conn = new NpgsqlConnection(("Server=" + list[0] + ";Port=" + list[1] + ";User Id=" + list[2] + ";Password=" + list[3] + ";Database=" + list[4] + ";"));
conn.Open();
if (ParseGlob != "") Mystr = ("INSERT INTO " + list[5] + "(\"F_TagName_ID\"," + list[9] + ",\"F_Date\") VALUES (" + IdCom + ",(SELECT * FROM " + ParseGlob + "(\'" + value + "\')),\'" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\' )");
else Mystr = ("INSERT INTO " + list[5] + "(\"F_TagName_ID\"," + list[9] + ",\"F_Date\") VALUES (" + IdCom + ",\'" + value + "\',\'" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\' )");
// MessageBox.Show(Mystr);
NpgsqlCommand command = new NpgsqlCommand(Mystr, conn);
int rowsaffected;
rowsaffected = command.ExecuteNonQuery();
conn.Close();
inData = "";
// logger.Info("ok "+ value);
value = "";
}
else
{
logger.Debug("port_DataReceived "+value);
value = "";
inData = "";
return;
}
// проверка, если в InData появилась полная строка - отрезаем кусок
// и обрабатываем, а лучше в другой поток для обработки передаем
////////
}
catch (Exception msg)
{
logger.Debug(msg);
logger.Debug(Mystr);
return;
}
}
}
#endregion