在一个类里给主窗体发送自定义消息
private void SynReceiveData(object serialPortobj)
{
SerialPort serialPort = (SerialPort)serialPortobj;
System.Threading.Thread.Sleep(0);
serialPort.ReadTimeout = 500;
int iReadBuffSize =
serialPort.ReadBufferSize;
while(serialPort.IsOpen)
{
try
{
byte firstByte = Convert.ToByte(serialPort.ReadByte());
int bytesRead = serialPort.BytesToRead;
byte[] bytesData = new byte[bytesRead + 1];
bytesData[0] = firstByte;
for (int i = 1; i <= bytesRead; i++)
bytesData[i] = Convert.ToByte(serialPort.ReadByte());
sData = System.Text.Encoding.Default.GetString(bytesData);
SendMessage(parentwnd, WM_TEST, 0, 0);
Thread.Sleep(200);
}
catch (Exception e)
{
// 处理超时错误
Thread.Sleep(500);
}
}
}
主窗体中接收不到那个自定义消息
protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
switch (m.Msg)
{
case WM_TEST: //处理消息
if (m.WParam.ToInt32() == 2)
{
}
RawData.AppendText(pcom.sData);
break;
default:
base.DefWndProc(ref m);//调用基类函数处理非自定义消息。
break;
}
}
解决方案
10
有几个疑问
1、为什么要定义 byte firstByte = Convert.ToByte(serialPort.ReadByte()); 呢
这样读取数据不是更好吗
1、为什么要定义 byte firstByte = Convert.ToByte(serialPort.ReadByte()); 呢
这样读取数据不是更好吗
var buffer = new byte[sp.BytesToRead]; sp.Read(buffer, 0, buffer.Length); var sData = Encoding.Default.GetString(buffer);
2、为什么不直接用 SendMessage 发送 sData 呢
[DllImport("user32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, StringBuilder lParam); // 用 StringBuilder
// 模拟发送
button.Click += (o, g) =>
{
const int WM_USER = 0x0400; // 依稀记得这是用户消息的常数值
var sb = new StringBuilder();
sb.AppendLine("fadfasdfadsfasdfasdfasd您好好");
SendMessage(Handle, WM_USER, 0, sb); // 直接发送 StringBuilder
};
// 接收
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == 0x0400)
{
Console.WriteLine(Marshal.PtrToStringAnsi(m.LParam)); // 接收消息
}
}
10
为什么不更直接用Control.Invoke呢?
:)谁告诉本人,语文里“直接”可以用比较级吗?
20
WM_TEST = ?
还有你确定执行到 SendMessage 了吗
20
那要检查 parentwnd 了
你这样,不要在这个方法中执行 sendmessage
在窗口上放个按钮,点击按钮,在事件代码中进行调试
主要 查看 parent 的 handler,还有,假如 parent 有 hide/show 的行为, parent.handler 是会被重新分配的
你这样,不要在这个方法中执行 sendmessage
在窗口上放个按钮,点击按钮,在事件代码中进行调试
主要 查看 parent 的 handler,还有,假如 parent 有 hide/show 的行为, parent.handler 是会被重新分配的