すべてで、私たちはibuttonを読むためのibuttonデバイスを持っています。このデバイスはusbであり、FTDI仮想コンポートを持っています。レビューwince 6.0
私たちは読者からのデータを読むために私たちの簡単なアプリケーションを持っていますが、読者は問題を抱えています(読者の方がスワイプするとデータを送信しません) この場合G停止して起動する)、comportを再起動する - しかし、再起動後には、アプリケーションの複製はCPUの100%を消費する。
ここには、私たちが何をする必要があるか、あるいはソースコードを変更する方法があります。 ありがとうございます
using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using OpenNETCF;
namespace SerialDownload
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
AddLog("Vytvaram novy seriovy port");
serialPort1 = new System.IO.Ports.SerialPort();
serialPort1.PortName = "COM4";
serialPort1.Handshake = System.IO.Ports.Handshake.None;
serialPort1.DataReceived += serialPort1_DataReceived;
//serialPort1.ErrorReceived += new System.IO.Ports.SerialErrorReceivedEventHandler(serialPort1_ErrorReceived);
//serialPort1.PinChanged += new System.IO.Ports.SerialPinChangedEventHandler(serialPort1_PinChanged);
serialPort1.WriteBufferSize = 10000;
serialPort1.RtsEnable = true;
serialPort1.DtrEnable = true;
serialPort1.ReadTimeout = 2000;
serialPort1.WriteTimeout = 2000;
AddLog("Vytvoreny seriovy port");
}
bool zelena = false;
private void timerResetCOM_Tick(object sender, EventArgs e)
{
timerResetCOM.Enabled = false;
if (!nacitavam_kartu_serial)
{
try
{
string znak = "G";
if (!zelena)
{
znak = "g";
zelena = true;
}
else
{
zelena = false;
}
AddLog("Posielam " + znak);
serialPort1.WriteTimeout = 2000;
serialPort1.Write(znak);
System.Threading.Thread.Sleep(200);
AddLog("Odoslane " + znak);
}
catch
{
System.Threading.Thread.Sleep(200);
AddLog("Chyba serioveho portu pri odoslani G");
try
{
serialPort1.DataReceived -= serialPort1_DataReceived;
AddLog("robim discard");
serialPort1.DiscardOutBuffer();
System.Threading.Thread.Sleep(200);
AddLog("Discard dokonceny");
AddLog("Zatvaram port");
serialPort1.Close();
AddLog("port zatvoreny");
KillProc("SerialDownload");
}
catch
{
System.Threading.Thread.Sleep(200);
AddLog("Chyba zatorenia portu");
}
/*
try
{
AddLog("Dispose serioveho");
serialPort1.DataReceived -= serialPort1_DataReceived;
serialPort1.Dispose();
System.Threading.Thread.Sleep(200);
AddLog("Dispose serioveho OK");
AddLog("Vytvaram novy seriovy port");
serialPort1 = new System.IO.Ports.SerialPort();
serialPort1.PortName = "COM4";
serialPort1.Handshake = System.IO.Ports.Handshake.None;
serialPort1.DataReceived += serialPort1_DataReceived;
//serialPort1.ErrorReceived += new System.IO.Ports.SerialErrorReceivedEventHandler(serialPort1_ErrorReceived);
//serialPort1.PinChanged += new System.IO.Ports.SerialPinChangedEventHandler(serialPort1_PinChanged);
serialPort1.WriteBufferSize = 10000;
serialPort1.RtsEnable = true;
serialPort1.DtrEnable = true;
serialPort1.ReadTimeout = 2000;
serialPort1.WriteTimeout = 2000;
AddLog("Vytvoreny seriovy port");
}
catch (Exception ex)
{
AddLog("Chyba vytvaranie serioveho portu - alebo rusenia");
}
System.Threading.Thread.Sleep(1000);
try
{
AddLog("otvaram port");
serialPort1.Open();
serialPort1.RtsEnable = true;
serialPort1.DtrEnable = true;
serialPort1.ReadTimeout = 2000;
serialPort1.WriteTimeout = 2000;
AddLog("port otvoreny");
}
catch
{
System.Threading.Thread.Sleep(200);
AddLog("Chyba otvorenia portu");
}*/
}
}
}
bool nacitavam_kartu_serial = false;
private void KillProc(string name)
{
var processes = OpenNETCF.ToolHelp.ProcessEntry.GetProcesses();
foreach (OpenNETCF.ToolHelp.ProcessEntry process in processes)
{
if (name == process.ExeFile)
{
process.Kill();
}
}
}
private void AddLog(string riadok)
{
Debug.WriteLine(DateTime.Now.ToString("yyyy-mm-dd HH:mm:ss") + ": " + riadok);
}
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
nacitavam_kartu_serial = true;
AddLog("Nacitacam data");
try
{
string pStrTmp = string.Empty;
while (serialPort1.BytesToRead > 0)
{
pStrTmp += (char)serialPort1.ReadByte();
System.Threading.Thread.Sleep(15);
}
string card_id_t = pStrTmp;
AddLog("Nacitane data: " + card_id_t);
StreamWriter subor = File.CreateText("\\NAND\\karta_serial.txt");
subor.Write(card_id_t);
subor.Close();
}
catch (Exception ex)
{
AddLog(ex.Message);
}
nacitavam_kartu_serial = false;
}
}
}
に役立ちます願っています。それは 'serialPort1.DataReceived + =新しいSystem.IO.Ports.SerialDataReceivedEventHandler(serialPort1_DataReceived)'ではないでしょうか? – AlainD
もう一つのコメントは 'ReadByte'と' Sleep'コマンドについてです。おそらく、通信チャネルがデータで詰まっている可能性があります。私はスリープを削除してデバッグするか、 'ReadLine'を使います(これはWindows CE 6.0アプリケーションでRS232ポートを使う方法です)。 – AlainD