本人是做硬件的,最近由于“业务需要”,最近在做一个WINCE5.0下的串口通信程序。程序是参考这个程序http://www.codeproject.com/KB/cs/serialcommunication.aspx写的。今天终于能发送16进制数据了(至少我在WINCE下向PC发送时,串口调试助手能接收到数据),但是我用它向单片机(C8051F330)发送数据时,单片机却不能正常接收到数据。偶尔接收到的数据也不是想要的。
我的发送16进制数据的代码如下:
if (this.cB_Hex.Checked == true)
                {
                    string s = textBox.Text.Replace(" ", "");
                    byte[] buffer = new byte[s.Length / 2];
                    for (int i = 0; i < s.Length; i += 2)
                        buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16);
                    //sp.Write(buffer, 0, textBox.Text.Length / 2);//发送数据
                    sp.Write(buffer, 0,s.Length / 2);//发送数据
                }
忘各位大大不吝指点。还有一个问题就是:它(WINCE下的串口程序)能向PC发送数据,但是接收不到PC发来的数据?(能接收,只是不能在文本框里显示)。再次感谢!!!

解决方案 »

  1.   

    如果你串口都设置正确的话,应该是这句有问题buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16);
      

  2.   

    关于接收并显示的问题:
    你需要看一下serialport类的一个事件:DataReceived和一个属性:ReceivedBytesThreshold 关于发送的问题,如果你是在wince上做调试,你可能需要以下的几个方法: #region 字节数组和字符串的相互转换
            /// <summary>
            /// 字节数组转换十六进制字符串(不带空格)
            /// </summary>
            /// <param name="data">要转换的字节数组</param>
            /// <returns>转换后的字符串</returns>
            public static string ByteArrayToHexStringNoBlank(byte[] data)
            {
                StringBuilder sb = new StringBuilder(data.Length * 3);
                foreach (byte b in data)
                    //sb.Append(Convert.ToString(b, 16).PadLeft(2, '0').PadRight(3, ' '));
                    sb.Append(Convert.ToString(b, 16).PadLeft(2, '0'));
                return sb.ToString().ToUpper();
            }
            /// <summary>
            /// 字节数组转换十六进制字符串(不带空格)
            /// </summary>
            /// <param name="data">要转换的字节数组</param>
            /// <param name="_length">要转换的长度</param>
            /// <returns>转换后的字符串</returns>
            public static string ByteArrayToHexStringNoBlank(byte[] data, int _length)
            {
                StringBuilder sb = new StringBuilder(data.Length * 3);
                int i = 0;
                foreach (byte b in data)
                {
                    if (i > data.Length)
                        break;
                    if (i >= _length)
                        break;
                    //sb.Append(Convert.ToString(b, 16).PadLeft(2, '0').PadRight(3, ' '));
                    sb.Append(Convert.ToString(b, 16).PadLeft(2, '0'));
                    i++;
                }
                return sb.ToString().ToUpper();
            }
            //
            /// <summary>
            /// 十六进制字符串转换字节数组(自动去掉空格)
            /// </summary>
            /// <param name="s">要转换的字符串</param>
            /// <returns>转换后的字节数组</returns>
            public static byte[] HexStringToByteArray(string s)
            {
                s = s.Replace(" ", "");
                byte[] buffer = new byte[s.Length / 2];
                for (int i = 0; i < s.Length; i += 2)
                    buffer[i / 2] = Convert.ToByte(s.Substring(i, 2), 16);
                return buffer;
            }
            #endregion
      

  3.   

    其实程序没有问题。是自己粗心造成的。从ARM开发板发出的数据经一无源232到485转接器才到的单片机。而开发板上的串口是3线的,无法从串口窃电。
      

  4.   

    你好!能不能给我一份wince下的c#串口程序。谢谢了邮箱:[email protected]