Em đang làm đề tài, nhận tín hiệu của TV remote control qua cổng hồng ngoại của PPC, dùng .Net compact framework, em scan trên máy thì có 4 cổng COM, gồm COM2 (bluetooth), COM3 (infrared port), COM4 Native IR, COM9 (Serial cable on COM1). Dùng một đối tượng của lớp SerialPort sp,
khi dùng lệnh mở cổng, thì chỉ mở được cổng COM2 và COM3, mà em cần mở cổng COM4 để nhận tín hiệu. Khi dùng lệnh
SerialPort sp = new SerialPort(“COM4”);
sp.open();
thì bị báo lỗi IOException.
trước đó em có dùng lệnh sp.IsOpen() để kiểm tra xem cổng này có mở ko, và kết quả trả về là false → cổng này ko mở. Nhưng khi phát lệnh mở thì bị báo lỗi IOException. Có bác nào biết vì sao ko, làm ơn giúp em.
Bạn phải copy nguyên mã lỗi lên đây để mọi người nhận định chứ ??
private void comboBoxPorts_SelectedIndexChanged(object sender, EventArgs e)
{
_serialport.Close();
_serialport.PortName = comboBoxPorts.SelectedItem.ToString();
/try
{/
if (_serialport.IsOpen)
textBoxStatus.Text = “Cong nay dang mo!”;
else
_serialport.Open();
/}
catch (IOException) { Application.Exit(); }/
}
Đây là đoạn mã gặp lỗi, khi đọc đến lệnh _serialport.Open() thì bị quăng ra lỗi, báo IOException was unhandled (vì em đã xóa cái phần xử lý lỗi này), nếu không xóa phần xử lý như đoạn code trên, thì ứng dụng sẽ thoát khi gặp lỗi.
Mà em ko hiểu sao lại gặp lỗi này. Ở những câu lệnh trên em đã kiểm tra xem port này có đang mở hay ko, debug thấy nó trả về false có nghĩa là port này đang ko mở, vậy mà khi phát lệnh mở thì nó lại báo lỗi IOException. Ko hiểu sao vậy ?
Nó còn có message này nữa.
{“An error message cannot be displayed because an optional resource assembly containing it cannot be found”}
Bạn thử đoạn code này xem sao?? Có vấn đề gì lên đây trao đổi tiếp, tui nghĩ đây chỉ là một số lỗi Close/Open không đúng thứ tự, Cổng thực sự đang mở nhưng ko trả về message IsOpen đúng. Bạn cứ thử vấn đề gì lên đây trao đổi tiếp!
Try
With _serialport
.PortName = “COM1”
.BaudRate = 9600
.Parity = IO.Ports.Parity.Even
.DataBits = 7
.StopBits = IO.Ports.StopBits.One
End With
_serialport.Close()
_serialport.Open()
MsgBox(_serialport.ReadLine())
Catch ex As Exception
MsgBox(ex.ToString)
End Try
Cảm ơn bác. Đoạn code bác cho trên có lẽ sẽ chạy được, vì theo như em nói ở trên, thì với cổng COM2, và COM3 khi mở sẽ ko có vấn đề gì, cổng COM4 mới là cổng em cần quan tâm. Cổng này là cổng giao tiếp hồng ngoại “raw ir” (chỉ có cổng này mới truyền nhận tín hiệu được với TV). Em đã lục tung cả cái forum của Microsoft lên, trên đó cũng có nói nhiều về vấn đề này, đa số là bế tắc trong việc lập trình cho cổng hồng ngoại “raw ir” trên môi trường .NET (.NET chưa hỗ trợ). Nhưng có thể làm trên C++, gọi hàm API, nhưng em lại ko bít lập trình cho PPC bằng C++, em dùng VS2005 mà.
Có một cách để gọi các hàm API (native code) trong .NET (manage code) là dùng P/Invoke, em cũng chưa rành về cái này, vẫn đang tìm hiểu tiếp, nếu bác đã từng làm về cái này thì chỉ cho em cái.
Thanks.
Bạn cứ thử thay đoạn code kia với đầu vào PortName = “COM2” xem sao đã nhé
Bạn dùng VS2005 thì dùng luôn cái VC++ ấy, viết cho smartdevice, còn dùng ứng dụng Managed code để gọi hàm trong dll ( viết bằng natived code ) cũng không quá phức tạp.
Khai báo
using System.Runtime.InteropServices;
…
[DllImport(“coredll.dll”)]
public static extern IntPtr LoadLibrary(string libName);
[DllImport(“coredll.dll”)]
public static extern bool FreeLibrary(IntPtr hLibModule);
…
Và gọi hàm:
…
private IntPtr hLibModule;
hLibModule = LoadLibrary(“mapirule.dll”);
…
Tương tự như vậy bạn có thể liên kết mã lệnh viết đóng gói thư viện vào ứng dụng .NET của mình. Chúc thành công!
Em đã thử cổng COM2, và COM3 rồi, mở được ko có vấn đề gì cả, nhưng tiếc là nó ko thể nhận tín hiệu của remote control. Sau mấy ngày lục tìm trên mấy forum nước ngoài thì em cũng hiểu tại sao mà mở cái COM4 lại bị báo IOException, trong khi _serialport.IsOpen trả về là false. Thực ra _serialport.IsOpen trả về là false chỉ cho chúng ta biết rằng hiện tại Port đó ko được mở bởi bất kỳ một đối tượng nào của Class SerialPort, nhưng có thể nó đang được mở bởi một ứng dụng, hay chương trình nào đó (ko dùng Class SerialPort). Và em đoán là nó đang được mở bởi cổng hồng ngoại, vì cái cổng này luôn trong trạng thái mở. Vì vậy em đã tắt cái cổng này đi, quả nhiên sau đó thì không gặp lỗi nữa, đã nhận được tín hiệu của remote control. Vui qué.
Nhưng giờ em lại gặp vấn đề khác, serialport thì có một bộ đệm (buffer) và một thuộc tính là BaseStream, hai cái này nó khác nhau sao mấy bác, em ko bít là khi mà nhận được tín hiệu từ cái remote control truyền vào, thì dư liệu đó được lưu ở đâu (theo em nghĩ là buffer), thế thì cái BaseStream dùng để làm gì ? Menthod này ReadExisting() nó đọc cả dữ liệu ở buffer lấn BaseStream.
Cảm ơn 2 bác đã cùng tham gia thảo luận.