2016-05-31 9 views
0

내 Visual Studio (VS) 프로그램에서 arduino에서 수신되는 값을 읽습니다. IR을 통해 arduino에 신호를 보낼 때마다 VS의 텍스트 상자에 코드가 생성됩니다. lastvalue라는 변수에 저장하고 있습니다. > A, - 2 -> B, ... 데이터베이스 값을 배열로 반환 하시겠습니까?

가 어떻게 버튼에서를 누를 수

그 코드가 데이터베이스 테이블 컬럼과 관련이
private void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     lastValue = serialPort1.ReadLine(); //reads serial  
    } 

, 내 말은 내가 코드 1을 보내는 경우이다 내 VS 프로그램 및 arduino에서받은 코드를 기반으로하는주기를 시작하여 배열을 채 웁니다. 내가 arduino에 코드 1, 2, 5, 10을 전송한다고 상상해 봅시다.이 배열은 [a, b, e, j]와 같습니다.

private void btnLoadDB_Click(object sender, EventArgs e) 
    { 
     string constring = @"Data Source=.\SQLEXPRESS..."; 
     SqlConnection conDataBase = new SqlConnection(constring); 
     SqlCommand cmdDataBase = new SqlCommand("select LETTER from TABLE where CODE = " + lastValue + ";", conDataBase); 

     SqlDataAdapter sda = new SqlDataAdapter(); 
     sda.SelectCommand = cmdDataBase; 
     DataTable dbdataset = new DataTable(); 
     sda.Fill(dbdataset); 
     BindingSource bSource = new BindingSource(); 

     bSource.DataSource = dbdataset; 
     dgvData.DataSource = bSource; 
     sda.Update(dbdataset);   
    } 

내가 지금하고있는 일은 한 번에 버튼을 누르면 마지막 코드에 해당하는 한 글자로 된 datagridview가 생성됩니다. 배열의 모든 코드에서 모든 문자를 가져올주기가 필요합니다.

내 SQL 테이블 :

enter image description here

그래서 목적은 : 사용자 805,316,096, 805,316,100 805,316,185 및 송신 어레이 여야 [0, 4, KEY_DOWN].

은 내가 내가 다음에 내가 805,316,100을 보내고 "KEY_DOWN는"4

lastValue로 대체, 코드 805316185 눌러 버튼을 보내고 "KEY_DOWN"을 얻을 수있어 지금하고 있어요 (3 서로 다른 전송 코드) : 사전에

enter image description here

감사

+0

는 정확한 값이 lastValue''에 반환하고 결국 원하는 DataTable을 여러분이 '1'을'a'로 바꾸고 싶다면 SQL과 Arduino가 필요 없다는 식으로 - int i = 1; char c = (char) (96 + i); ' – jimbobmcgee

+0

@jimbobmcgee 지금은 더 좋을 것이라고 생각합니다. 시퀀스가 아닙니다 –

+0

그리고 'lastValue'? 한 줄에 하나의 코드입니까, 아니면 직접 단어를 나눠야합니까 (각 단어를 어떻게 구분합니까)? 내가 업로드 한 두 번째 이미지에서 볼 수 있듯이 행당 코드는 – jimbobmcgee

답변

2

, 다음 DataReceived 경우에, 목록에 추가 (Chris Steele's answer에 따라) 코드의 List<string>을 유지 배열로 출력하십시오 :

public string[] GetMappedKeyCodes() 
{ 
    var mapping = GetMapping(); 

    List<string> clone; 
    lock (_sync) clone = new List<string>(_receivedCodes); 

    return clone.Select(code => { 
        string key; 
        return mapping.TryGetValue(code, out key) 
          ? key 
          : null; 
       }) 
       .Where(key => !string.IsNullOrEmpty(key)) // skip unmapped values 
       .ToArray(); 
} 

private IReadOnlyDictionary<string, string> GetMapping() 
{ 
    var constring = @"Data Source=.\SQLEXPRESS..."; 

    using (var conn = new SqlConnection(constring)) 
    using (var cmd = new SqlCommand("select LETTER, CODE from TABLE;", conn)) 

    var mappedCodes = new Dictionary<string, string>(); 
    using (var reader = cmd.ExecuteReader()) 
    { 
     if (reader.MoveNext()) 
     { 
      var codeOrd = reader.GetOrdinal("CODE"); 
      var letterOrd = reader.GetOrdinal("LETTER"); 

      do 
      { 
       var code = reader.GetString(codeOrd); 
       var letter = reader.GetString(letterOrd); 
       mappedCodes[code] = letter;     
      } 
      while (reader.MoveNext()); 
     } 
    } 

    return new ReadOnlyDictionary<string, string>(mappedCodes); 
} 

여유롭게 GetMapping의 결과를 캐시하십시오. 은 매번 직렬 포트에서 완전한 라인을 얻지 못할 수도 있으므로 모든 데이터를 가져와야 할 수도 있습니다.

+0

Thanks @jimbobmcgee! 귀찮게해서 죄송합니다. 프로그램에 내 방법을 입력하려면 어떻게해야합니까? 내가 실행할 때, 그냥 통과하지 못한다. –

+0

배열이 필요한 지점에서 코드로 직접 호출한다. – jimbobmcgee

1

스토어 목록에 코드를, 정말 필요한 경우 배열로 변환 :

private readonly object _sync = new object(); 
private readonly List<string> _receivedCodes = new List<string>(); 

private void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    var readValue = (serialPort1.ReadLine() ?? string.Empty).Trim(); //reads serial 

    if (!string.IsNullOrEmpty(readValue)) 
    { 
     lock (_sync) _receivedCodes.Add(readValue); 
     lastValue = readValue; 
    } 
} 

가에서 코드를 조회 할 양식 코드에 메서드를 추가 : 양식에

List<string> codes = new List<string>(); 
codes.Add(code1); 
codes.Add(code2); 
codes.Add(code3); 
string[] codeArray = codes.ToArray(); 
0

내 예 : OleDbConnection conn = new OleDbConnection(); { DataTable dt = new DataTable(); conn.ConnectionString을 = "당신의 CONN 문자열로,"DT이라고

  OleDbCommand comm = new OleDbCommand(); 
      { 
       comm.CommandText = "Select * from *****"; 
       comm.Connection = conn; 
       OleDbDataAdapter da = new OleDbDataAdapter(); 
       { 
        da.SelectCommand = comm; 
        da.Fill(dt); 
       } 

참고하여 당신은 입력의 샘플을 게시 할 필요 해요

관련 문제