none
傳給讀卡機命令的疑問 RRS feed

  • 問題

  • 大家好~~

    我是用 VC 試著把Command傳給讀卡機, 但是我在傳出去的矩陣中, 發現到我的(array<Byte>)矩陣除了我給他的數字代號以外, 還會有他所對應的字元.....

    小弟我有試過利用兩台電腦做測試, 結果接收端所接收到的訊息跟傳送端一樣,具有字元~~

    若一起傳出去了, 是否會造成讀取錯誤???還是說數字是數字,字元是字元.??

    如果連字元也會一起傳出去~~會造成錯誤!!那~是否有任何方法,可以讓程式不會有字元的出現???(任何方法都可以, 因為我試過的方法都會有字元的產生~~讓人頭痛)

     

    謝謝指教~~~

    2006年8月3日 下午 07:55

解答

  • 您好,看起來資料本身看起來是如同妳寫入的值,至於妳使用偵錯模式所看的字元值只是VS.NET讓妳方便的讀取Byte資訊的顯示而已,實際的資料就如同妳填入的值 buf[0] = 0x02, buf[1] = 0x01, buf[2] = 0x01, buf[3] = 0x05, buf[4] = 0x05,是沒錯的。 不過有點觀念上可以分享,會不會是妳要傳給讀卡機的資訊,並不是整數值2,1,1,5,5而是'2','1','1','5','5',因為對於電腦而言,這兩者的資料是不同的。 舉例來說:

    ///以下的數值以十六進制表示

    byte a = 0x01;  ///代表的十進位資料就是1,顯示在畫面上的字元是空白

    byte a = 0x31; //代表的十進位資料是49,顯示在畫面上的字元是1

    希望對妳有幫助

     

    2006年8月6日 下午 03:56

所有回覆

  • 你好,我不是很瞭解你的意思,但是我猜測可能是因為你定義的陣列及資料傳送的方式可能有問題,或是請妳把程式碼的片段貼出來參考,比較知道原因。

    2006年8月4日 下午 02:23
  • 你好~~謝謝你的回覆

    以下是我的程式碼

     using namespace System;
     using namespace System::ComponentModel;
     using namespace System::Collections;
     using namespace System::Windows::Forms;
     using namespace System::Data;
     using namespace System::Text;
     using namespace System::IO::Ports;
     using namespace System::IO ;

     public ref class Form1 : public System::Windows::Forms::Form
     {
      public: static cli::array<Byte> ^buf = gcnew cli::array<Byte>(256);
      public: static cli::array <Byte>^ inbyte = gcnew cli::array <Byte>(256);
      public: static String^  LRC,^  LEN,^  INS,^  STX,^  NAD,^  data,^ err;//OR static char STX;
      public: static int readCount;  ....

    ...

    private: static System::IO::Ports::SerialPort^  serialPort1;

    ....

    #pragma region Windows Form Designer generated code
      
      void InitializeComponent(void)
      {
       this->components = (gcnew System::ComponentModel::Container());
       this->serialPort1 = (gcnew System::IO::Ports::SerialPort(this->components));......
       this->SuspendLayout();
       //
       // serialPort1
       //
       this->serialPort1->DtrEnable = true;
       this->serialPort1->DataReceived += gcnew System::IO::Ports::SerialDataReceivedEventHandler(this, &Form1::serialPort1_DataReceived);
       this->serialPort1->ErrorReceived += gcnew System::IO::Ports::SerialErrorReceivedEventHandler(this, &Form1::serialPort1_ErrorReceived);

    .....}
      static void Read_SN()
      {
       const int LEN = 0x01;
       const int INS = 0x05;
       const int LRC = 0x05;
       buf[2] = LEN;  buf[3] = INS;  buf[4] = LRC;   
     }
    #pragma endregion
     private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
         const int STX = 0x02;              
    const int NAD = 0x01;      //OR STX = (char)2;
         buf[0] = STX;                            buf[1] = NAD;
         serialPort1->BaudRate = 9600;
         serialPort1->Open();

        }
     private: System::Void serialPort1_DataReceived(System::Object^  sender, System::IO::Ports::SerialDataReceivedEventArgs^  e) {
                try
                {

                        textBox2->Text = textBox2->Text + serialPort1->ReadExisting ();
                        //OR  readCount = serialPort1->Read (inbyte,0,44);
                        //OR  data = serialPort1->ReadExisting ();
                }
                catch (Exception ^ex)
                {
                         MessageBox::Show("ComRecorder: Filed to read from COM port:" + ex->Message);
                } 
     
               } 

       private: System::Void 傳送訊息_Click(System::Object^  sender, System::EventArgs^  e) {
                 // Button to send test data
                    
    Read_SN();
                 try
                 {
                        serialPort1->Write (buf,0,44);   //傳送方式
                 }
                 catch (Exception ^wex)
                 {
                          MessageBox::Show(wex->ToString());
                 }

       }

    我曾試過BreakPoint去看矩陣的值, 如下: buf[0] = 2 ' ┐' , buf[1] = 1 '   ' , buf[2] = 1 '   '  ,  buf[3] = 5 '│', buf[4] = 5'│'

    謝謝指教~~~~Thanks !!

    2006年8月4日 下午 06:16
  • 您好,看起來資料本身看起來是如同妳寫入的值,至於妳使用偵錯模式所看的字元值只是VS.NET讓妳方便的讀取Byte資訊的顯示而已,實際的資料就如同妳填入的值 buf[0] = 0x02, buf[1] = 0x01, buf[2] = 0x01, buf[3] = 0x05, buf[4] = 0x05,是沒錯的。 不過有點觀念上可以分享,會不會是妳要傳給讀卡機的資訊,並不是整數值2,1,1,5,5而是'2','1','1','5','5',因為對於電腦而言,這兩者的資料是不同的。 舉例來說:

    ///以下的數值以十六進制表示

    byte a = 0x01;  ///代表的十進位資料就是1,顯示在畫面上的字元是空白

    byte a = 0x31; //代表的十進位資料是49,顯示在畫面上的字元是1

    希望對妳有幫助

     

    2006年8月6日 下午 03:56
  • 你好 謝謝你的解釋,讓我又多吸收了些知識。

    就像你說的,我要給的資訊是 [02] + "01010505"(Data Sheet Type) ,因此我曾試過把每個控制元設為 「char」 格式,但是仍然沒用,(ex : STX = (char)0x02;  OR STX = (char)02; )所得到的結果讀卡機仍然沒反應。(連『 錯誤的回應』 也沒有,試過矩陣跟字串還有擷取他的Byte或是char數,都無效)。 又Data Sheet 表示  "  "   資料型態為String  Type,因此我也試過把他們視為字串,仍然無效。不知是否我哪裡錯了??? 是我設定參數的方式是錯的???

    謝謝指教~~

     

    2006年8月6日 下午 05:43
  • 謝謝你的分享~~~就如同你的觀念~~~

    我把"01010505"   變成 '0'+'1'+'0'+'1'+'0'+'5'+'0'+'5'方式~~~就成功了!!!

    謝謝你的幫忙,讓我終於前進了一大步~~~Thanks for your help~~~

    2006年8月7日 上午 06:38