2012-09-20 171 views
2

我使用COM端口(串行)发送和接收数据。我写了下面的代码。这实际上是我第一个C#项目,因为我有点新鲜。我正尝试将接收到的数据写入桌面上的文本文件,程序实际上创建了文件,但没有写入任何内容。同样,我可以在控制台上看到收到的数据,但它没有写入文本文件。任何帮助我做错了将不胜感激。将数据写入文本文件

谢谢。代码如下。

class Program 
{ 
    SerialPort p = new SerialPort("COM7", 300, Parity.None, 8, StopBits.One); 
    string sbuffer = string.Empty; 
    byte i = 0; 
    static void Main(string[] args) 
    { 
     new Program(); 
    } 

    Program() 
    { 
     string[] names = SerialPort.GetPortNames(); 
     Console.WriteLine("Serial ports:"); 
     foreach (string name in names) 
     { 
      Console.WriteLine(name); 
     } 
     Console.WriteLine("Using COM7"); 

     p.Open(); 


     string data_ = "$1RB\r"; 
     Console.WriteLine("Writing data: {0}",data_); 
     p.Write(data_); 
     p.DataReceived += new SerialDataReceivedEventHandler(p_DataReceived); 
     Console.ReadKey(); 
     p.Close(); 
    } 


    void p_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     Thread.Sleep(5); 
     sbuffer += (sender as SerialPort).ReadExisting(); 
     i++; 
     if (i > 9) 
     { 
      Console.WriteLine(sbuffer); 
      System.IO.File.WriteAllText(@"C:\Users\myname\Desktop\WriteText.txt", sbuffer); 
      sbuffer = string.Empty; 
     } 
    } 
} 

}

回答

1

你可以使用事件,或者干脆用这个方法,你的数据字符串传递给它。只要文件存在,它将简单地追加到文件中,或者如果不存在,则创建一个新文件。写入的数据应该与控制台屏幕上显示的任何输出相同。

static void WriteOutputToTextFile(string _data) 
    { 
     string FolderName = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); //set destination as your desktop 
     using (StreamWriter SW = new StreamWriter(FolderName + "\\test.txt", true)) //true makes it append to the file instead of overwrite 
     { 
      SW.WriteLine(_data); 
      SW.Close(); 
     } 
    } 
+0

谢谢......这很有效。 – RAC

+0

@ user1687153:接受答案比说谢谢更好。 – Cdeez

0

您正在打开并重复覆盖同一文件。使用FileStream(或更好的StreamWriter)类,保持流与串口一起打开,并在完成后关闭它。另外,如果您通过串行端口传输文本,则可能需要考虑更容易使用的SerialPort.ReadLine()方法。

+0

我试图使用ReadLine,但出于某种原因,它不适用于我的代码。正如我所提到的,我对C#非常陌生,希望能够提供一个能够与我的代码一起工作的示例。再次感谢。 – RAC

0

延长@ Alan的回答,您可以使用File.AppendAllText而不是File.WriteAllText,它将一次又一次地覆盖文件。因此,如果在检查文件之前收到空文本,则文件将被空文本覆盖。